Мои настоящие модели более сложны, но я попытался свести проблему к основной проблеме. Что-то я не понимаю. Пожалуйста, попробуйте это на 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' в конец основного шаблона, он будет соответствовать второй записи, но не первой. Таким образом, очевидно, что все это рассматривается как одна линия. Но почему? Мой многострочный фильтр утверждает, что если строка не начинается с новой строки, это часть предыдущей записи, верно? Хорошо, это должно оставить пустую строку посередине, которая явно начинается с новой строки и, следовательно, должна содержать отдельное событие, не так ли?
Любые указатели с благодарностью принимаются.
Ввод
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
также работал в моих тестах, похоже, это подтверждает, что строка, переданная в фильтр, является полностью пустой строкой (без новой строки или любых других символов завершения).