NginX Grok 模式 - 处理反斜杠或括号?

NginX Grok Pattern - Handling Backslashes or Brackets?

我正试图消除我的 logstash 框中的所有 _grokparsefailure。

似乎唯一的两个罪魁祸首是 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 调试器,失败与 %{URIPATHPARAM:request} 在第一个示例中击中 [EXPAND] 的括号以及在第二个示例中击中 \x5C%2230\x5C%22 的反斜杠有关. IE。如果我从输入中删除 [、] 或 \,那么 grok 匹配得很好。

我似乎不知道如何让 URIPATHPARAM grok 过滤器来处理那些括号和反斜杠的例子。有什么想法吗?

如您所见,URIPATH 不允许使用方括号。由于 have/want 括号,您需要使用其他东西。 %{NOTSPACE}怎么样?

一般来说,我建议使用@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}