第一种 程序友好型json格式:

log_format json_format  escape=json
    '{"@timestamp":"$time_iso8601",'
    '"client_ip":"$remote_addr",'
    '"client_region":"$ipdb_raw",'
    '"request_method":"$request_method",'
    '"request_scheme":"$scheme",'
    '"request_host":"$host",'
    '"request_uri":"$request_uri",'
    '"http_referer":"$http_referer",'
    '"send_body_size":"$body_bytes_sent",'
    '"http_status":"$status",'
    '"is_completion":"$request_completion",'
    '"request_time":"$request_time",'
    '"user_agent":"$http_user_agent",'
    '"XFF":"$http_x_forwarded_for",'
    '"request_protocol":"$server_protocol",'

    '"upstream_name":"$proxy_host",'
    '"upstream_addr":"$upstream_addr",'
    '"upstream_response_time":"$upstream_response_time",'
    '"upstream_status":"$upstream_status",'
    '"upstream_response_length":"$upstream_response_length",'
    '"upstream_connect_time":"$upstream_connect_time",'
    '"upstream_cache_status":"$upstream_cache_status",'
    '"upstream_bytes_sent":"$upstream_bytes_sent",'
    '"upstream_bytes_received":"$upstream_bytes_received",'

    '"nginx_host":"$hostname",'
    '"ssl_protocol":"$ssl_protocol",'
    '"ssl_cipher":"$ssl_cipher",'
    '"request_id":"$request_id"}';

json格式对程序友好,配合ELK等日志采集、分析系统使用很方便,方便对日志进行深度分析。但是多数人平时比较喜欢直接查看日志文件,这时json格式的日志文件看起来就不够清晰了,日志较长,冗余信息较多,使用shell命令进行统计和分析也不方便。

第二种 运维友好型自定义格式:

log_format  main  escape=json
    '$remote_addr |$ipdb_raw |[$time_local] |$host |$request |$status |BodySent:$body_bytes_sent |ReqTime:$request_time |$request_completion |$http_x_forwarded_for |$proxy_host |$upstream_addr |$upstream_status |$upstream_cache_status |UpResTime:$upstream_response_time |UpConnTime:$upstream_connect_time |UpResLen:$upstream_response_length |$hostname-$request_id |$scheme |$request_body |$http_referer |$http_user_agent |$http_cookie';

这种格式使用“|”作为分隔符,日志打印也不是很长,方便使用AWK等命令进行统计

需注意以下几点:

  1. $ipdb_raw这个变量是ipip.net ip库的nginx模块,如果未使用这个模块会报错,去掉或换成GEOIP即可。
  2. escape=json 表示以json格式输出,高版本的Nginx已经支持json格式,对于第二种自定义格式,开启这个参数能在access log中打印中文,不会乱码。
  3. $http_cookie是打印所有cookies,当然也可以打印session,对于高安全要求的情况,日志中不会允许泄漏用户cookies。但是某些情况需调试或打印非敏感的cookies,可以打印指定cookies,如打印nginx session sticky生产的cookies,假设名字叫backend: 'TRACE:$cookie_backend'。
  4. $hostname-$request_id 如果有做全局调用链分析的需求,这个参数可以做为全局的UUID,nginx对每个请求都生成一个唯一的UUID,传给后端工程打印出来即可。