Как сопоставить шаблон a=b c=d с изменением порядка в grok (logstash)?

Я использую Logstash для сопоставления журналов анализатора Fortinet, и проблема в том, что существует так много шаблонов без порядка полей.

например один тип сообщения будет:

service=DNS hostname="a.b.net" profile="Dns" action=blocked reqtype=direct url="/" sentbyte=0 rcvdbyte=0 direction=N/A msg="URL belongs to a denied category in policy" method=domain cat=61 catdesc="Phishing" crscore=60 crlevel=high

... и еще:

msg="File is infected." action=blocked service=HTTP sessionid=33137 direction=incoming filename="favicon.ico" quarskip=No-skip virus="MSWord/Agent.DD60!tr" dtype="Virus" ref="http://www.fortinet.com/ve?vn=MSWord%2FAgent.DD60%21tr" virusid=6920465 profile="AV"

Как видите, у обоих есть msg, action, service и profile, но в другом порядке.

Есть ли способ построить шаблон, чтобы он соответствовал чему-то вроде:

(.*?)=%{DATA:\1?}\s 

... при указании поля имени первого совпадения?


person eladelad    schedule 03.11.2015    source источник
comment
Кажется, ^(?=.*msg="(?<msg>[^"]*)")(?=.*action=(?<action>\S*))(?=.*service=(?<service>\S*))(?=.*profile="(?<profile>[^"]*)") может помочь. Пожалуйста, проверьте. Однако для этого требуется наличие всех 4 параметров. Если некоторые или все могут отсутствовать, используйте ? после именованных захватов.   -  person Wiktor Stribiżew    schedule 03.11.2015
comment
Это один большой файл записей? Если отдельные поля расположены не по порядку, как узнать, где заканчивается одна запись и начинается следующая? Кроме того, каковы возможности механизма регулярных выражений, который вы используете? Например, это делает условные выражения?   -  person    schedule 03.11.2015


Ответы (1)


Используйте фильтр kv{}, который может разделять это все отдельно и не заботится о порядке.

person Alain Collins    schedule 03.11.2015
comment
Использование kv фильтра решило все. Большое спасибо, только теперь я понимаю, что kv означает значение ключа... Спасибо. - person eladelad; 04.11.2015