Вы можете использовать
%{URIPATH:path}(?:%{URIPARAM:param})?
Модели представлены в https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns.
%{URIPATH:path}
будет соответствовать пути, в то время как (?:%{URIPARAM:param})?
будет соответствовать 1 или 0 вхождений (из-за дополнительного без захвата группы (?:...)?
) из строки запроса.
Если вам нужно избавиться от ?
в param
, вы можете также использовать
(?<path>(?:/[A-Za-z0-9$.+!*'(){},~:;[email protected]#%_-]*)+)(?:\?(?<param>[A-Za-z0-9$.+!*'|(){},[email protected]#%&/=:;_?\[\]-]*))?
Выходной сигнал для /aaaa/admin.php?file=xpto.js&version=abcd123
ввода:
{
"path": [
[
"/aaaa/admin.php"
]
],
"param": [
[
"?file=xpto.js&version=abcd123"
]
]
}
Выход для /aaaa/admin.php
:
{
"path": [
[
"/aaaa/admin.php"
]
],
"param": [
[
null
]
]
}
спасибо. работайте отлично на https://grokconstructor.appspot.com/do/match! – Jam
Я также добавил [пользовательское регулярное выражение] (https://regex101.com/r/qnBJer/1) (на основе встроенных шаблонов grok), если вы хотите избавиться от '?' В 'param' стоимость. –