История:
У меня есть пользовательский сгенерированный файл журнала, который имеет следующий шаблон:
[2014-03-02 17:34:20] - 127.0.0.1|ERROR| E:\xampp\htdocs\test.php|123|subject|The error message goes here ; array (
'create' =>
array (
'key1' => 'value1',
'key2' => 'value2',
'key3' => 'value3'
),
)
[2014-03-02 17:34:20] - 127.0.0.1|DEBUG| flush_multi_line
Вторая запись [2014-03-02 17:34:20] - 127.0.0.1|DEBUG| flush_multi_line
Является фиктивной линией, чтобы позволить logstash знать, что событие с несколькими линиями завершено, эта строка будет удалена позже.
Мой конфигурационный файл следующий:
input {
stdin{}
}
filter{
multiline{
pattern => "^\["
what => "previous"
negate=> true
}
grok{
match => ['message',"\[.+\] - %{IP:ip}\|%{LOGLEVEL:loglevel}"]
}
if [loglevel] == "DEBUG"{ # the event flush line
drop{}
}else if [loglevel] == "ERROR" { # the first line of multievent
grok{
match => ['message',".+\|.+\| %{PATH:file}\|%{NUMBER:line}\|%{WORD:tag}\|%{GREEDYDATA:content}"]
}
}else{ # its a new line (from the multi line event)
mutate{
replace => ["content", "%{content} %{message}"] # Supposing each new line will override the message field
}
}
}
output {
stdout{ debug=>true }
}
Вывод для поля content: The error message goes here ; array (
Проблема:
Моя проблема заключается в том, что я хочу сохранить остальную часть многострочного поля содержимого:
The error message goes here ; array (
'create' =>
array (
'key1' => 'value1',
'key2' => 'value2',
'key3' => 'value3'
),
)
Итак, я могу удалить поле сообщения позже.
В поле @message содержится все многострочное событие, поэтому я попробовал фильтр mutate с функцией replace, но я ' m просто не может заставить его работать:(.
Я не понимаю, как работает Multiline filter, если кто-то может пролить свет на это, было бы очень благодарно.
Спасибо,
Абду.