【问题标题】:Grok pattern to match URIPATH with optional URIPARAM将 URIPATH 与可选的 URIPARAM 匹配的 Grok 模式
【发布时间】:2018-11-10 16:58:23
【问题描述】:

我想用 Grok Pattern 过滤掉这个

172.20.20.88 - - [10/Nov/2018:23:49:31 +0700] "GET /id/profile.pl?user=285&device=Bg3tlX HTTP/1.1" 502 852 "-" "Go-http-client/2.0" "0.009"

我正在使用 COMMONAPACHELOG

%{IPORHOST:clientip} %{HTTPDUSER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|-)

我试过%{URIPATH:request}%{URIPARAM:request}。请求的结果仍然是/id/profile.pl?user=285&device=Bg3tlX。我的期望是/id/profile.pl

我的参考是https://github.com/hpcugent/logstash-patterns/blob/master/files/grok-patterns

【问题讨论】:

    标签: regex grok graylog2


    【解决方案1】:

    您的%{NOTSPACE:request} 匹配HTTP/1.1" 502 85... 之前的任何1 个或多个非空白字符,因为NOTSPACE 模式是\S+。因此,它匹配整个 /id/profile.pl?user=285&device=Bg3tlX 子字符串。

    您不能只使用URIPATHURIPARAM,因为您仍然需要匹配输入的其余部分。您必须同时使用这两种方法,但通过将URIPATH 包含在可选的非捕获组(?:...)? 中,使URIPARAMURIPATH 之后成为可选。

    所以,将%{NOTSPACE:request} 替换为

    %{URIPATH:request}(?:%{URIPARAM:requestparam})?
                      ^^^                        ^^
    

    https://grokdebug.herokuapp.com/ 上的演示:

    【讨论】:

    • 非常感谢...谢谢谢谢...我被困了8个小时...几乎放弃...手动使用正则表达式在我脑海中一一交叉。 ..但你帮我解决了...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    相关资源
    最近更新 更多