将 URIPATH 与可选 URIPARAM 相匹配的 Grok 模式
Grok pattern to match URIPATH with optional URIPARAM
我想使用 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
您的 %{NOTSPACE:request}
匹配 HTTP/1.1" 502 85...
之前的任何 1 个或多个非空白字符,因为 NOTSPACE
模式是 \S+
。因此,它匹配整个 /id/profile.pl?user=285&device=Bg3tlX
子串。
您不能只使用 URIPATH
或 URIPARAM
,因为您仍然需要匹配输入的其余部分。您必须同时使用两者,但是通过将 URIPARAM
包含在可选的非捕获组 (?:...)?
.
中,使 URIPARAM
在 URIPATH
之后成为可选的
因此,将 %{NOTSPACE:request}
替换为
%{URIPATH:request}(?:%{URIPARAM:requestparam})?
^^^ ^^
演示在 https://grokdebug.herokuapp.com/:
我想使用 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
您的 %{NOTSPACE:request}
匹配 HTTP/1.1" 502 85...
之前的任何 1 个或多个非空白字符,因为 NOTSPACE
模式是 \S+
。因此,它匹配整个 /id/profile.pl?user=285&device=Bg3tlX
子串。
您不能只使用 URIPATH
或 URIPARAM
,因为您仍然需要匹配输入的其余部分。您必须同时使用两者,但是通过将 URIPARAM
包含在可选的非捕获组 (?:...)?
.
URIPARAM
在 URIPATH
之后成为可选的
因此,将 %{NOTSPACE:request}
替换为
%{URIPATH:request}(?:%{URIPARAM:requestparam})?
^^^ ^^
演示在 https://grokdebug.herokuapp.com/: