Nginx 的 access log 如何以 json 形式记录?

Nginx 的 access log 默认是以空格分隔的字符串形式记录的,格式如下

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

官方文档 ngx_http_log_module 中已经有详尽的说明

Syntax: log_format name [escape=default|json] string ...;
Default: log_format combined "...";
Context: http

The escape parameter (1.11.8) allows setting json or default characters escaping in variables, by default, default escaping is used.

这里需要注意的是从 1.11.8 开始 Nginx 已经支持 json 格式,如果版本低于这个建议使用 nginx-http-json-log 扩展

log_format 配置

log_format json_combined escape=json '{"@timestamp":"$time_iso8601",'
                      '"@source":"$server_addr",'
                      '"@nginx_fields":{'
                      '"remote_addr":"$remote_addr",'
                      '"remote_user":"$remote_user",'
                      '"body_bytes_sent":"$body_bytes_sent",'
                      '"request_time":"$request_time",'
                      '"status":"$status",'
                      '"host":"$host",'
                      '"uri":"$uri",'
                      '"server":"$server_name",'
                      '"port":"$server_port",'
                      '"protocol":"$server_protocol",'
                      '"request_uri":"$request_uri",'
                      '"request_body":"$request_body",'
                      '"request_method":"$request_method",'
                      '"http_referrer":"$http_referer",'
                      '"body_bytes_sent":"$body_bytes_sent",'
                      '"http_x_forwarded_for":"$http_x_forwarded_for",'
                      '"http_user_agent":"$http_user_agent",'
                      '"upstream_response_time":"$upstream_response_time",'
                      '"upstream_addr":"$upstream_addr"}}';

变量含义

$remote_addr, $http_x_forwarded_for 记录客户端IP地址
$remote_user 记录客户端用户名称
$request 记录请求的URL和HTTP协议
$request_length 请求的长度(包括请求行,请求头和请求正文)。
$request_time 请求处理时间,单位为秒,精度毫秒;从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$status 记录请求状态
$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。
$bytes_sent 发送给客户端的总字节数。
$connection 连接的序列号。
$connection_requests 当前通过一个连接获得的请求数量。
$msec 日志写入时间。单位为秒,精度是毫秒。
$pipe 如果请求是通过 HTTP 流水线(pipelined)发送,pipe值为“p”,否则为“.”。
$http_referer 记录从哪个页面链接访问过来的
$http_user_agent 记录客户端浏览器相关信息
$time_iso8601 ISO8601标准格式下的本地时间。
$time_local 通用日志格式下的本地时间。
$request_body 获取请求 body 内容
$cookie_[COOKIE_NAME] 通过 cookie 名字记录 cookie 值
$http_[HEADER_NAME] 通过 header 名字记录 header 值

参考链接

  • ngx_http_log_module
  • how to generate a json log from nginx
  • the-nginx-log-configuration
  • $host、$http_host 、$server_name 这三个变量有什么不同
  • nginx日志配置(cookie,header,post等字段记录)

你可能感兴趣的:(Nginx 的 access log 如何以 json 形式记录?)