我正在尝试排除 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 过滤器处理那些括号和反斜杠的示例。有什么想法吗?
最佳答案
一般来说,我建议使用 @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}
关于regex - NginX Grok 模式 - 处理反斜杠或括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31691841/