自定义Nginx日志格式

最近看到白总写了几个Nginx的日志格式,很不错。


有时候需要自定义下Nginx的日志格式,来满足自己的需求。

修改 nginx.conf 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
http {
# ...
log_format main '$remote_addr $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'$http_user_agent $http_x_forwarded_for $request_time $upstream_response_time $upstream_addr $upstream_status';
# 为什么有的变量有双引号,有的没有呢?
# 如果变量结果是数字的,就不需要双引号,变量是字符的,就需要双引号
log_format apm '[$time_local]\tclient=$remote_addr\t'
'request="$request"\t request_length=$request_length\t'
'http_referer="$http_referer"\t'
'bytes_sent=$bytes_sent\t'
'body_bytes_sent=$body_bytes_sent\t'
'user_agent="$http_user_agent"\t'
'upstream_addr=$upstream_addr\t'
'upstream_status=$upstream_status\t'
'cookie="$http_cookie"\t'
'request_body="$request_body"\t'
'document_root="$document_root"\t'
'fastcgi_script_name="$fastcgi_script_name"\t'
'request_filename="$request_filename"\t'
'request_time=$request_time\t'
'upstream_response_time=$upstream_response_time\t'
'upstream_connect_time=$upstream_connect_time\t'
'upstream_header_time=$upstream_header_time\t';
}

上面配置了两个log_format,设置两个log_format的目的是为了让不同的后端的服务,使用不用日志格式。如果后端的server没有配置,就默认使用 main 标记的日志。

1
2
3
4
5
# 比如这样
access_log /var/log/nginx/access.log main;
# 或者这样
access_log /var/log/nginx/getip-access.log apm;

访问测试一下,结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
client=192.168.1.100
request="GET / HTTP/1.1"
request_length=452
http_referer="-"
bytes_sent=170
body_bytes_sent=14
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36"
upstream_addr=192.168.1.80:8080
upstream_status=200
cookie="-"
request_body="-"
document_root="/etc/nginx/html"
fastcgi_script_name="/"
request_filename="/etc/nginx/html/"
request_time=5.006
upstream_response_time=5.006
upstream_connect_time=0.000
upstream_header_time=5.006

-------------The End-------------