nginx log format

nginx 日志详解

Nginx日志格式和目录通常在配置文件/etc/nginx/nginx.conf中。

Nginx日志格式

access日志

配置文件中定义了Nginx日志的打印格式,即main格式:

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

默认格式如下

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

json格式日志

log_format json_format  '{"@timestamp":"$time_iso8601",'
    '"client_ip":"$remote_addr",'
    '"remote_user":"$remote_user",'
    '"request_method":"$request_method",'
    '"protocol":"$scheme",'
    '"uri":"$uri",'
    '"status":"$status",'
    '"upstream_status":"$upstream_status",'
    '"size":"$body_bytes_sent",'
    '"upstream_response_time":"$upstream_response_time",'
    '"upstream_addr":"$upstream_addr",'
    '"nginx_node":"$hostname",'
    '"http_user_agent":"$http_user_agent",'
    '"connection":"$connection",'
    '"request_time":"$request_time"}'; 

声明使用了main这种日志格式和写入的文件名。

access_log /var/logs/nginx/access.log main

声明使用了json这种日志格式和写入的文件名。

access_log /path/to/access.log json;

错误日志

错误日志主要记录客户端访问Nginx出错时的日志,格式不支持自定义。

通过错误日志,你可以得到系统某个服务或server的性能瓶颈等。因此,将日志好好利用,你可以得到很多有价值的信息。错误日志由指令error_log来指定,具体格式如下:

error_log path(存放路径) level(日志等级)

path含义同access_log,level表示日志等级,具体如下:
[ debug | info | notice | warn | error | crit ]
从左至右,日志详细程度逐级递减,即debug最详细,crit最少。

举例说明如下:
error_log logs/error.log info;
需要注意的是:error_log off并不能关闭错误日志,而是会将错误日志记录到一个文件名为off的文件中。

正确的关闭错误日志记录功能的方法如下:
error_log /dev/null;
上面表示将存储日志的路径设置为“/dev/null”。

日志样例

Nginx日志样例如下:

192.168.1.2 - - [10/Jul/2023:15:51:09 +0800] "GET /ubuntu.iso HTTP/1.0" 0.000 129 404 168 "-" "Wget/1.11.4 Red Hat modified"

默认日志

172.20.0.139 - - [27/Aug/2023:03:00:24 +0000] "POST /api/goodsReturn/pushUpdateGoods HTTP/1.1" 200 17 "-" "okhttp/3.11.0"

字段说明

字段名称 含义
remote_addr 表示客户端IP地址。
remote_user 表示客户端用户名称。
request 表示请求的URL和HTTP协议。
status 表示请求状态。
body_bytes_sent 表示发送给客户端的字节数,不包括响应头的大小;该变量与Apache模块modlogconfig里的bytes_sent发送给客户端的总字节数相同。
bytes_sent 发送给客户端的总字节数
connection 表示连接的序列号。
connection_requests 表示当前通过一个连接获得的请求数量。
msec 表示日志写入的时间。单位为秒,精度是毫秒。
pipe 表示请求是否通过HTTP流水线(pipelined)发送。通过HTTP流水线发送则pipe值为p,否则为.
http_host 请求的url地址(目标url地址)的host
host 等同于$http_host
http_referer 表示从哪个页面链接访问过来的。
http_user_agent 表示客户端浏览器相关信息,前后必须加上双引号。
request_length 表示请求的长度。包括请求行,请求头和请求正文。
request_time 表示请求处理时间,单位为秒,精度为毫秒。从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
[$time_local] 表示通用日志格式下的本地时间,前后必须加上中括号。
upstream_addr 集群轮询地址
upstream_response_time 指从Nginx向后端(php-cgi)建立连接开始到接受完数据然后关闭连接为止的时间
upstream_connect_time 与服务器连接所花费的时间
upstream_status upstream状态
uri 请求中的当前URI(不带请求参数,参数位于$args),不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改。
document_uri 等同于$uri
request_uri 比$uri多了参数,即$uri+$args
http_x_forwarded_for 如果使用了代理,这个参数会记录代理服务器的ip和客户端的ip
schema 协议
server_name 虚拟主机名称
server_port 服务器端口
server_protocol 服务器协议
ssl_cipher 交换数据中的算法
ssl_protocol SSL协议版本