Шаблон Grok для соответствия URIPATH с необязательным URIPARAM - PullRequest
0 голосов
/ 10 ноября 2018

Я хочу использовать 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

1 Ответ

0 голосов
/ 10 ноября 2018

Ваш %{NOTSPACE:request} соответствует любому 1 или более непробельным символам до HTTP/1.1" 502 85..., так как шаблон NOTSPACE равен \S+. Таким образом, он соответствует всей подстроке /id/profile.pl?user=285&device=Bg3tlX.

Вы не можете использовать только URIPATH или URIPARAM, потому что вам все равно нужно сопоставить остальную часть ввода. Вы должны использовать оба, но сделать URIPARAM необязательным после URIPATH, заключив его в необязательную группу без захвата, (?:...)?.

Итак, замените %{NOTSPACE:request} на

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

Демо на https://grokdebug.herokuapp.com/:

enter image description here

...