Как прописать или/или в 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 шт):

Автор решения: Wiktor Stribiżew

Используйте

%{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", находит ноль и более символов отличных от '
      • ' - одиночная кавычка
→ Ссылка