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