我找到了关于使用nstx自定义日志格式进行logstash的good article。在一个主题评论中有:
注意:最终用户可以设置两个(引用者,用户代理)和四个(请求方法,remote_user),因此可能导致JSON无效(即将用户代理设置为“}”)
只要nginx没有明确的JSON支持,我建议手动>构建JSON并坚持使用logstack支持的组合日志。
我应该如何使用自定义日志格式来防止此问题?
答案 0 :(得分:3)
创建包含内容的grok
NGUSERNAME [a-zA-Z\.\@\-\+_%]+
NGUSER %{NGUSERNAME}
NGINXACCESS %{IPORHOST:clientip} %{NGUSER:ident} %{NGUSER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer}) %{QS:agent}
并过滤
filter {
grok {
patterns_dir => ["Grok_DIR"]
match => { "message" => "%{NGINXACCESS}" }
}
}
答案 1 :(得分:1)
在任何版本的nginx中不防弹来手工制作JSON - \ xXX是无效的JSON编码,它应该是\ u00XX。如果nginx使用\ xXX转义,任何正确的JSON解析器都将拒绝JSON字符串。
如果您使用LogStash执行此操作,您将大部分时间都可以,但希望json会不时解析失败。
答案 2 :(得分:0)
我认为在最新版本的nginx中它很好:
2011年10月17日nginx 1.1.6的变化
*) Change: now the 0x7F-0x1F characters are escaped as \xXX in an
access_log.
2008年5月19日nginx 0.7.0的变化
*) Change: now the 0x00-0x1F, '"' and '\' characters are escaped as \xXX
in an access_log.
Thanks to Maxim Dounin.