Логташ Грок / Многострочная путаница
Мои реальные шаблоны более сложны, но я попытался свести проблему к основной проблеме. Что-то, чего я не понимаю. Пожалуйста, попробуйте это на http://grokconstructor.appspot.com/do/match
Я пытаюсь сопоставить следующие строки:
Start-Date: 2017-08-07 06:48:12
End-Date: 2017-08-07 06:48:12
Start-Date: 2017-08-07 12:55:16
End-Date: 2017-08-07 12:56:01
Используя дополнительные шаблоны:
DATE_EU2 %{YEAR}-%{MONTHNUM}-%{MONTHDAY}[\s]+?%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}?
DATE_COMB %{DATE_EU2}?%{DATE_EU}?%{DATE_US}?
И следующая основная закономерность:
Start-Date: %{DATE_COMB:starttime}\nEnd-Date: %{DATE_COMB:endtime}
С многострочным фильтром:
^\n (negated)
Запустите это, и вы должны (надеюсь!) Получить:
Start-Date: 2017-08-07 06:48:12 End-Date: 2017-08-07 06:48:12 Start-Date: 2017-08-07 12:55:16 End-Date: 2017-08-07 12:56:01
MATCHED
starttime 2017-08-07··06:48:12
endtime 2017-08-07··06:48:12
after match: Start-Date: 2017-08-07 12:55:16 End-Date: 2017-08-07 12:56:01
Таким образом, это соответствует первой записи, но не соответствует второй. Если я добавлю '\z' в конец основного шаблона, он будет соответствовать второй записи, но не первой. Таким образом, он явно рассматривает все это как одну строку. Но почему? Мой многострочный фильтр утверждает, что если строка не начинается с новой строки, это часть предыдущей записи, верно? Ну, это должно оставить пустую строку в середине, которая явно начинается с новой строки и, следовательно, должна содержать отдельное событие, нет?
Любые указатели с благодарностью приняты.
1 ответ
Вход
Start-Date: 2017-08-07 06:48:12
End-Date: 2017-08-07 06:48:12
Start-Date: 2017-08-07 12:55:16
End-Date: 2017-08-07 12:56:01
Многострочный фильтр = ^\n
(Отрицается)
Многострочный фильтр просматривает каждую строку по очереди, чтобы увидеть, что следует объединить.
First line starts with `^Start-Date` (merged)
Second line starts with `^End-Date` (merged)
Third line is blank (merged, unless logstash skips blank lines)
Fourth line starts with `^Start-Date` (merged)
Fifth line starts with `^End-Date` (merged)
Пытаясь соответствовать \n
Особенно в начале строки нет смысла.
Вам лучше соответствовать ^End-Date:
и объединяя это с предыдущим. (Или если есть еще строки для события, и оно всегда начинается с Start-Date:
Подбери и отрицай.
Редактировать, основываясь на комментариях и тестировании с конструктором Grok.
Если имеет смысл использовать пустую строку в качестве разделителя записей, ^\z
или же ^\Z
Похоже на работу. \Z
игнорирует любой последний терминатор, но видя как \z
также работал в моих тестах, кажется, чтобы подтвердить, что строка, когда передается в фильтр, является полностью пустой строкой (без новой строки или любых других символов завершения).