问题:
request_body中含有中文时,nginx日志会转换为十六进制。
优化:
logstash为了能高效的处理各类日志,希望日志是一种特定结构存储的方式。
nginx默认日志格式:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" $request_body';
问题日志
[25/Feb/2019:00:00:10 +0800]|192.168.10.19|POST /paas/callback HTTP/1.1|200|163|0.002|0.002|{\x22rc\x22:0,\x22msg\x22:\x22success\x22,\x22transferrate\x22:\x2245301\x22}]}}
request_body
中都是转换后十六进制,不易阅读.
直接提供可视化日志格式和解决十六进制的解决办法:
格式化数据:
###json格式:
log_format log_json escape=json '{"timestamp": "$time_local",'
'"remote_addr": "$remote_addr",'
'"referer": "$http_referer",'
'"request": "$request",'
'"statu": "$status",'
'"byte": "$body_bytes_sent",'
'"agen": "$http_user_agent",'
'"x_forwarde": "$http_x_forwarded_for",'
'"request_time": "$request_time"}';
###自定义边界:
log_format main escape=json '[$time_iso8601]|$remote_addr|$request_method|$request|$status|$body_bytes_sent|$request_time|$request_body|'
'"$http_referer"|"$http_user_agent"|$http_x_forwarded_for|'
'"$upstream_addr"|$upstream_response_time|'
'$upstream_cache_status|$scheme|$http_user_agent';
- log_format :日志格式开头
- main :日志名称
- escape=json :nginx 1.11.8版本后才提供此参数。链接
如果版本低,要么升级,要么在logstash中使用ruby给做一次转化,可参考链接:https://github.com/logstash-plugins/logstash-codec-json/issues/2
总结:
正常格式的日志,在logstash中需要使用grok语句进行匹配,会消耗较多的性能。如果日志在生成时就将格式固定好,后续的处理就会很简易。