我找到了一篇关于使用 nginx custom log format for logstash 的好文章。在一个主题评论中有:
注意:最终用户可以设置两个(推荐人,用户代理)和四个(请求方法,remote_user)之间,因此可能导致JSON无效(即,将用户代理设置为“})。
只要 nginx 没有明确的 JSON 支持,我建议不要手动 > 构建 JSON 并坚持使用 logstack 很好支持的组合日志。
我应该如何使用自定义日志格式来防止这个问题?
用内容创造 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}" }
}
}
在任何版本的 nginx 中手工制作 JSON 都不是万无一失的 - \xXX 不是有效的 JSON 编码,它应该是 \u00XX 。如果 nginx 使用 \xXX 转义,任何正确的 JSON 解析器都会拒绝 JSON 字符串。
如果您使用 LogStash 执行此操作,您通常会没事,但会不时出现 json 解析失败。
我认为在最新版本的 nginx 中很好:
nginx 1.1.6 的变化 2011 年 10 月 17 日
*) Change: now the 0x7F-0x1F characters are escaped as \xXX in an
access_log.
nginx 0.7.0 的变化 2008 年 5 月 19 日
*) Change: now the 0x00-0x1F, '"' and '\' characters are escaped as \xXX
in an access_log.
Thanks to Maxim Dounin.