代码之家  ›  专栏  ›  技术社区  ›  autonomy

NginX Grok模式-处理睫毛或支架?

  •  2
  • autonomy  · 技术社区  · 9 年前

    我想弄清楚我的日志箱里的所有错误。

    似乎只有两个罪魁祸首是NGINX日志,它们破坏了我的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}
    

    以下是标记为grok失败的消息结果的两个示例。

    172.31.0.2 - - [30/Jul/2015:15:10:49 +1000] "GET /web-app/[EXPAND] HTTP/1.1" 404 6432 "-" "Amazon CloudFront" "web-app.mydomain.com" "127.0.0.1" 
    
    172.31.0.2 - - [30/Jul/2015:14:13:52 +1000] "GET /web-app/show?wid=5540cfbc3asdf034ct=&domain=apptest.mydomain.com&ttl=\x5C%2230\x5C%22&filter_id=14026&unique_id=1 HTTP/1.1" 200 11400 "http://apptest.mydomain.com/"; "Amazon CloudFront" "apptest.mydomain.com" "127.0.0.1" 
    

    通过grok调试器,失败与第一个示例中的%{URIPATHPPARAM:request}击中[EXPAND]的括号和第二个示例中\x5C%2230\x5C%2的反斜杠有关。即,如果我从输入中删除[、]或\,则grok匹配良好。

    我似乎无法解决如何使用URIPATHPARAM grok过滤器来处理括号和反斜杠的示例。有什么想法吗?

    2 回复  |  直到 9 年前
        1
  •  2
  •   hurb    9 年前

    一般来说,我建议使用@Alain建议的另一种模式。如果你仍然想用更精确的模式来解决这个问题,你可以使用这样的grok字段:

    (?<request>(?:/[A-Za-z0-9$.+!*'(){}\[\]\\,~:;=&@#?%_\-]*)+)

    (这是带有反斜杠和括号的URIPATH和URIPARAM的混合。)

    整个grok模式如下所示:

    %{IPORHOST:clientip} %{NGUSER:ident} %{NGUSER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} (?<request>(?:/[A-Za-z0-9$.+!*'(){}\[\]\\,~:;=&@#?%_\-]*)+) HTTP/%{NUMBER:httpversion}" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer}) %{QS:agent}
    

    这两个例子都适用。

    然而,您的输入还有另一个问题。第二个在其引用者后面有分号( "http://apptest.mydomain.com/"; )第一个没有。你必须处理好这件事。

    因此,您需要模式具有可选分号 (?:;|) :

    %{IPORHOST:clientip} %{NGUSER:ident} %{NGUSER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer})(?:;|) %{QS:agent}
    
        2
  •  1
  •   Alain Collins    9 年前

    正如您所发现的,URIPATH不允许使用括号。既然你有/想要括号,你就需要使用其他东西。怎么样 %{NOTSPACE} ?