Как прописать или/или в grok(logstash)?
Есть вот такой лог:
<30>Jun 8 16:47:02 oem-virtual-machine dbus-daemon[668]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
Пытаюсь сделать вот что: 1)Если есть слово Successfully или, например failure, то записывать либо первое, либо второе слово в поле. Не понимаю как это сделать регулярным выражением. Также, например с пробелами: в одном логе есть лишний пробел, в другом совершенно таком же, нет. Больше они ничем не отличаются, но надо, чтобы их парсинг осуществлялся одним регексом.
2)Строчка 'org.freedesktop.nm_dispatcher'. Если она есть, то записывать в какое-нибудь поле. Если нет, то лог все равно парсится и ничего никуда не записывается.
Пока написал только вот это:
%{MONTH}\s\s%{MONTHDAY}\s%{TIME}\s%{HOSTNAME:[alertix][host]}\s%{NOTSPACE:[alertix][process][name]}:\s%{NOTSPACE}\s(Successfully|Failure)
Ответы (1 шт):
Используйте
%{MONTH}\s+%{MONTHDAY}\s+%{TIME}\s+%{HOSTNAME:[alertix][host]}\s+%{NOTSPACE:[alertix][process][name]}:\s+\[%{NOTSPACE:level}\]\s+(?<status>Successfully|Failure)[^']*(?:'(?<namespace>[^']*)')?
Подробности
- Все
\sзаменены на\s+, чтобы совпадение было найдено несмотря на количество пробелов между словами - В
\[%{NOTSPACE:level}\]квадратные скобки вынесены за пределы группы (Successfully|Failure)заменено именной захватывающей подмаской(?<status>Successfully|Failure)для создания отдельного поля (я назвал егоstatus, но вы можете изменить это название)[^']*(?:'(?<namespace>[^']*)')?находит[^']*- ноль и более символов отличных от'(?:'(?<namespace>[^']*)')?- необязательная незахватывающая подмаска:'- одиночная кавычка(?<namespace>[^']*)- Именная захватывающая подмаска "namespace", находит ноль и более символов отличных от''- одиночная кавычка