Logstash — Разделение поля, отфильтрованного с помощью Grok, на дополнительные поля

#elasticsearch #logstash #logstash-grok #filebeat

Вопрос:

У нас есть сообщения журнала, которые выглядят следующим образом:

 <TE CT="20:33:57.258102" Sv="N" As="CTWare.PerimeterService" T="PerimeterService" M="GetWallboard" TID="1" TN="" MID="" ID="" MSG="Exit method 'GetWallboard' took 00:00:00.0781247" />
 

Прямо сейчас мы используем следующий фильтр Grok:

 match => { "message" => "<TE CT="%{DATESTAMP:log_timestamp}" Sv=%{QS:severity} As=%{QS:assembly} T=%{QS:T} M=%{QS:M} TID=%{QS:TID} TN=%{QS:TN} MID=%{QS:MID} ID=%{QS:ID} MSG=%{QS:log_raw} />" }
 

Однако внутри поля «MSG» / «log_raw» я хочу попытаться извлечь метку времени после «…взял» в свое собственное поле. Я надеялся выполнить это, используя пользовательское регулярное выражение для извлечения «MSG» / «log_raw» до определенной точки, затем другое регулярное выражение для захвата метки времени «занято» и создания нового поля. Но, когда я тестирую с онлайн-отладчиками Grok, мне не везет. Возможно ли вообще сделать что-то подобное?

Ответ №1:

Ваше поле CT не соответствует МЕТКЕ ДАТЫ. Это будет соответствовать ВРЕМЕНИ. Затем вы можете использовать второй грок, чтобы извлечь время из поля [log_raw].

 grok { match => { "[log_raw]" => "took %{TIME:someField}" } }
 

получить

     "someField" => "00:00:00.0781247",
 

У меня возникло бы искушение использовать xml-фильтр для анализа этого [сообщения], так как он будет корректироваться, если когда-либо появятся дополнительные или отсутствующие поля.