目 录CONTENT

文章目录

Nginx日志详解

简中仙
2022-09-07 / 0 评论 / 0 点赞 / 70 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于2023-10-07,若内容或图片失效,请留言反馈。 本文如有错误或者侵权的地方,欢迎您批评指正!

1、访问日志

access_log off;			# 默认值为off

access_log logs/access.log combined;	# 参数path,设置日志输出的文件路径或syslog服务器地址。

access_log logs/log.gz combined gzip flush=5m;

map $status $loggable { 
    ~^[23]  0; 
    default 1; 
} 
access_log logs/access.log combined if=$loggable;
参数说明
path设置日志输出的文件路径或syslog服务器地址
format设置关联log_format指令定义的日志格式名
buffer设置日志文件缓冲区大小。当缓冲区日志数据超出该值时,缓冲区日志数据会被写到磁盘文件。默认缓冲区大小为64KB
flush设置日志缓冲区刷新的时间间隔,缓冲区日志的保护时间超过这个设定值时,缓冲区日志数据会被写到磁盘文件
gzip设置缓冲区数据的压缩级别,缓冲区数据会被压缩后再写出到磁盘文件。压缩级别范围1~9,级别越高压缩比越高,系统资源消耗也最大,默认级别为1
if设置是否记录日志,当参数值的条件成立,即不为0或空时,才记录日志。

2、错误日志

error_log syslog:server=192.168.2.109 error; 
error_log memory:32m debug; 
error_log /dev/null; 
 
# 访问文件不存在时,记入错误日志 
log_not_found on;
级别级别值级别说明
debug8代码中标记为NGX_LOG_DEBUG的输出,输出作为详细,配合调试使用
info7代码中标记为NGX_LOG_INFO的输出,因包括除debug级别的所有输出,故同样会消耗大量磁盘IO资源
notice6代码中标记为NGX_LOG_NOTICE的输出
warn5代码中标记为NGX_LOG_WARN的输出
error4代码中标记为NGX_LOG_ERROR的输出,实际生产环境中常用的输出级别
crit3代码中标记为NGX_LOG_CRIT的输出
alert2代码中标记为NGX_LOG_ALERT的输出
emery1代码中标记为NGX_LOG_EMERY的输出

3、日志格式

Nginx的日志输出位置及内容格式是通过access_log及error_log指令配置实现的。Nginx日志默认是文本格式,通过Nginx提供的log_format可以输出为json格式,并支持自定义日志输出的内容。

默认的日志格式

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    log_format json '{"@timestamp": "$time_iso8601", ' 
                    '"connection": "$connection", ' 
                    '"remote_addr": "$remote_addr", ' 
                    '"remote_user": "$remote_user", ' 
                    '"request_method": "$request_method", ' 
                    '"request_uri": "$request_uri", ' 
                    '"server_protocol": "$server_protocol", ' 
                    '"status": "$status", ' 
                    '"body_bytes_sent": "$body_bytes_sent", ' 
                    '"http_referer": "$http_referer", ' 
                    '"http_user_agent": "$http_user_agent", ' 
                    '"http_x_forwarded_for": "$http_x_forwarded_for", ' 
                    '"request_time": "$request_time"}';

TCP/UDP代理的访问日志

# 普通格式日志 
log_format  tcp  '$remote_addr - $connection - [$time_local] $server_addr: $server_port ' 
                  '- $status - $upstream_addr - $bytes_received - $bytes_sent - $session_time ' 
                  '- $proxy_protocol_addr:$proxy_protocol_port '; 
 
# JSON格式日志 
log_format json '{"@timestamp": "$time_iso8601", ' 
                '"connection": "$connection", ' 
                '"remote_addr": "$remote_addr", ' 
                '"server_addr": "$server_addr:$server_port" ' 
                '"status": "$status" ' 
                '"upstream_addr": "$upstream_addr" ' 
                '"bytes_received": "$bytes_received" ' 
                '"bytes_sent": "$bytes_sent" ' 
                '"session_time": "$session_time" ' 
                '"proxy_protocol_addr": "$proxy_protocol_addr:$proxy_protocol_port" '}'

4、日志格式可用变量

变量含义
$remote_addr记录客户端IP地址
$remote_user记录客户端用户名
$time_local记录通用的本地时间
$time_iso8601记录ISO8601标准格式下的本地时间
$request记录请求的方法以及请求的http协议
$status记录请求状态码(用于定位错误信息)
$body_bytes_sent发送给客户端的资源字节数,不包括响应头的大小
$bytes_sent发送给客户端的总字节数
$msec日志写入时间。单位为秒,精度是毫秒。
$http_referer记录从哪个页面链接访问过来的
$http_user_agent记录客户端浏览器相关信息
$http_x_forwarded_for记录客户端IP地址
$request_length请求的长度(包括请求行,请求头和请求正文)。
$request_time请求花费的时间,单位为秒,精度毫秒

5、日志输出到syslog

Nginx的访问日志和错误日志都支持将日志直接输出到syslog服务端

error_log syslog:server=192.168.1.1 debug; 
access_log syslog:server=unix:/var/log/nginx.sock,nohostname; 
access_log syslog:server=[2001:db8::1]:12345,facility=local7,tag=nginx,severity=info combined;
参数说明
server设置syslog服务器的地址,可以是IP、域名或UNIX套接字,默认端口514
facility日志消息模块,默认为local7
severity日志严重级别,默认为info。error_log指令时,由其第二个参数设置该值,所以此参数被忽略
tag设置标签,默认为nginx
nohostname不将hostname字段添加到syslog消息头

6、日志输出到docker控制台

我们知道,Docker 容器的日志是需要打印到控制台上才能被有效采集的,至少这是官方的日志输出方案。实际工作中,常用命令 docker logs 打印出的也正是 Docker 容器在控制台上输出的信息。但现实环境下,大多数应用都会把日志输入到文件中,这给应用的容器化带来了一些困扰。要实现日志打印到控制台,我们可以通过软链接重定向日志到控制台

假设我们的日志文件于:/var/log/demo_access.log、/var/log/demo_server.log、/var/log/demo_error.log
我们可以通过执行如下命令将其重定向到控制台:

# ln -sfT /dev/stdout "/var/log/demo_access.log"
# ln -sfT /dev/stdout "/var/log/demo_server.log"
# ln -sfT /dev/stderr "/var/log/demo_error.log" 
参数说明
-s, --symbolicmake symbolic links instead of hard links
-f, --force强行删除任何已存在的目标文件
-T, --no-target-directorytreat LINK_NAME as a normal file always

这些命令甚至可以直接在 Dockerfile 内预置,容器构建好运行时就能顺利将日志打印到控制台了!

 ln -sf /dev/stdout /var/log/nginx/access.log \
ln -sf /dev/stderr /var/log/nginx/error.log \
0

评论区