У меня есть файл журнала, который содержит строки, начинающиеся с метки времени. За каждой такой строкой с отметкой времени может следовать неопределенное количество дополнительных строк:
SOMETIMESTAMP some data
extra line 1 2
extra line 3 4
Дополнительные строки будут предоставлять дополнительную информацию для строки с отметкой времени. Я хочу извлечь 1, 2, 3 и 4 и сохранить их как переменные. Я могу разобрать лишние строки на переменные, если знаю, сколько их. Например, если я знаю, что есть две лишние строки, фильтр grok ниже будет работать. Но что мне делать, если я заранее не знаю, сколько дополнительных строк будет существовать? Есть ли способ проанализировать эти строки одну за другой перед применением многострочного фильтра? Это может помочь.
Кроме того, даже если я знаю, что у меня будет только 2 дополнительные строки, является ли фильтр ниже лучшим способом получить к ним доступ?
filter {
multiline {
pattern => "^%{SOMETIMESTAMP}"
negate => "true"
what => "previous"
}
if "multiline" in [tags] {
grok {
match => { "message" => "(?m)^%{SOMETIMESTAMP} %{DATA:firstline}(?<newline>[\r\n]+)%{DATA:secondline}(?<newline>[\r\n]+)%{DATA:thirdline}$" }
}
}
# After this would be grok filters to process the contents of
# 'firstline', 'secondline', and 'thirdline'. I would then remove
# these three temporary fields from the final output.
}
(Я разделил строки на отдельные переменные, так как это позволяет мне выполнять дополнительное сопоставление с образцом для содержимого строк по отдельности, без необходимости снова обращаться ко всему образцу. Например, на основе содержимого первой строки я может захотеть представить поведение ветвления для других строк.)