Многострочный грок последовательных событий одного типа с присоединением - PullRequest
0 голосов
/ 12 марта 2019

Рассмотрим следующую структуру файла журнала:

patA1 .*? patA2 .*? patA3
... (many lines here)
patB1 .*? patB2 .*? patB3
patB1 .*? patB2 .*? patB3

. В приведенном выше примере patXY представляют собой различные шаблоны регулярных выражений, то есть первая строка выше может быть grok ked через что-то вроде этого:

grok {
  match => { 
    "message" => "%{patA1:keyA1} (?<afterA1:.*?) %{patA2:keyA2} (?<afterA2:.*?) %{patA3:keyA3}"}
  }
}

Я хотел бы multiline выше и затем генерировать события из нескольких строк следующим образом:

event1: keyA3, keyB1, keyB3
event2: keyA3, keyB2, keyB3

То есть выбрать некоторые части из строки A и добавитьчто для каждой из строк B, заканчивающихся таким количеством событий, сколько есть Bs.

Другими словами, я хотел бы обработать вышеизложенное, как если бы выполнял однострочную обработку строк журнала, таких как:

patA1 .*? patA2 .*? patA3 .*? patB1 .*? patB2 .*? patB3
patA1 .*? patA2 .*? patA3 .*? patB1 .*? patB2 .*? patB3

, из которого я могу выбирать элементы только с помощью grok.

Обратите внимание, что строки имеют одинаковую структуру, поэтому при использовании multiline сообщение для вышеупомянутого выглядит следующим образом:

"message" => "patA1 .*? patA2 .*? patA3\npatB1 .*? patB2 .*? patB3\npatB1 .*? patB2 .*? patB3"

т.е. он имеет A и все B в одном и том же «блоке», поскольку B являются последовательными и все имеют одинаковую форму.

Какой лучший способ сделать это в logstash

1 Ответ

0 голосов
/ 12 марта 2019

Первый грок, как это:

grok {
  match => {
    "message" => ".*?(?<keyA3>patA3}"
  }
}

Это добавит keyA3 к событию.Затем разделите:

split {}

По умолчанию это будет разделено на message, что даст вам клонированные события для каждой из строк, таким образом сохраняя keyA3 от этого события.Затем отфильтруйте только строки B:

if ([message] !~ /patB1/) {
  drop {}
}

Затем снова перейдите к остальной необходимой информации:

grok {
  match => {
    "message" => "(?<keyB1>patB1) .*? (?<keyB2>patB2) .*? (?<keyB3>patB3)"
  }
}

В этот момент все события будут иметь keyA3, keyB1,keyB2 и keyB3, которые вы можете использовать по мере необходимости.

...