Nginx 日志改成 JSON 格式的方法

发布时间:2021-09-15

  Nginx 日志默认为普通文本的格式,例如,下面是 Nginx 的一行访问日志:

  10.88.122.105--[02/Dec/2017:09:15:04+0800]GET/js/pagination.jsHTTP/1.13040为了便于利用 Elastic Stack 日志平台收集展示 Nginx 的日志,可以将 Nginx 的日志改成 json 的格式。修改后的 json 日志格式如下所示:

  {@timestamp:12/Dec/2017:14:30:40+0800,remote_addr:10.88.122.108,referer:-,request:GET/HTTP/1.1,status:304,bytes:0,agent:Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.84Safari/537.36,x_forwarded:-,up_addr:-,up_host:-,up_resp_time:-,request_time:0.000}为了修改 Nginx 的日志格式改成 json,需要修改 Nginx 的配置文件,笔者 Nginx 的配置文件为f。

  

  http{ includemime.types; default_typeapplication/octet-stream; charsetutf-8; log_formatmain$remote_addr-$remote_user[$time_local]$request $status$body_bytes_sent$http_referer $http_user_agent$http_x_forwarded_for$request_time; log_formatlog_json{@timestamp:$time_local, remote_addr:$remote_addr, referer:$http_referer, request:$request, status:$status, bytes:$body_bytes_sent, agent:$http_user_agent, x_forwarded:$http_x_forwarded_for, up_addr:$upstream_addr, up_host:$upstream_http_host, up_resp_time:$upstream_response_time, request_time:$request_time }; access_loglogs/access.loglog_json; (省略内容) }在 Nginx 的配置文件nginx.conf中,我们定义了两种的日志格式:main和log_json,其中,main为普通的文本格式,log_json为 json 格式。log_json其实就是手工构造一个 json 字符串。定义了 json 的日志格式后,便可以指定 access log 为 json 格式:

  

  access_log logs/access.log log_json;

  修改 Nginx 的配置,重启 Nginx ,便可以看到 json 格式的日志,重启 Nginx:

  

  nginx -s reload

  

注册即送1000元现金券