如何正确使用带有logstash的nginx自定义日志

时间:2013-08-30 06:08:16

标签: nginx logstash

我找到了关于使用nstx自定义日志格式进行logstash的good article。在一个主题评论中有:

  

注意:最终用户可以设置两个(引用者,用户代理)和四个(请求方法,remote_user),因此可能导致JSON无效(即将用户代理设置为“}”)

     

只要nginx没有明确的JSON支持,我建议手动>构建JSON并坚持使用logstack支持的组合日志。

我应该如何使用自定义日志格式来防止此问题?

3 个答案:

答案 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.