Nginx输出JSON格式日志

将Nginx的日志转为json格式

将Nginx日志记录的字段以json格式创建一个命名的日志,配置log_format

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
27
28
map $upstream_response_time $upstream_response_timer {
default $upstream_response_time;
"" 0;
}# 处理非法json值,map指令的作用是创建一个变量,而这个变量由其它变量通过一个映射表置换得来
# 在Nginx中配置了301跳转,也就是说Nginx自己处理了这个请求,不再将请求向后端转发,这直接导致upstream_response_time的值为空,写入日志后,Nginx将空值替换为了-,这很明显不是一个json字符串
# 我们在配置文件中添加一个入下的map,在$upstream_response_time为空的时候返回为0,将该值赋值给新变量$upstream_response_timer,添加之后该问题得到了处理
log_format json escape=json '{"@timestamp":"$time_iso8601",'
'"@version":"1",'
'"server_addr":"$server_addr",'
'"remote_addr":"$remote_addr",'
'"host":"$host",'
'"uri":"$uri",'
'"body_bytes_sent":$body_bytes_sent,'
'"bytes_sent":$body_bytes_sent,'
'"upstream_response_time":$upstream_response_timer,'
'"request":"$request",'
'"request_length":$request_length,'
'"request_time":$request_time,'
'"status":"$status",'
'"http_referer":"$http_referer",'
'"http_x_forwarded_for":"$http_x_forwarded_for",'
'"http_user_agent":"$http_user_agent"'
'}';
# escape=json 恶意扫描请求可能包含如双引号(“)、反斜杠等在json字符串中被认为非法的字符,处理这类问题的最直接手段就是转义
server {
...
access_log /var/log/nginx/access.log json;
}