我正试图在我的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的反斜杠。即。如果我从输入中删除[,]或\,则grok匹配正常。
我似乎无法锻炼如何让URIPATHPARAM grok过滤器来处理括号和反斜杠的例子。有什么想法吗?
答案 0 :(得分:2)
一般情况下,我建议使用@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}
答案 1 :(得分:1)
正如您所发现的那样,URIPATH不允许使用括号。由于你有/想要括号,你需要使用别的东西。 menuItemTapped
怎么样?