У меня есть следующий файл журнала, каждая запись Logstash должна содержать многострочные строки, которые заканчиваются знаками тире '----', из примера журнала вы можете видеть, что у меня есть четыре ключа, последний ключ - «Сообщение». Я настроил следующий файл конфигурации, который обрабатывает все строки, кроме строки, начинающейся с «Сообщение:». Как видно из журнала, в некоторых случаях «Сообщение:» содержит более одной строки, и для этих случаев , мне нужно, чтобы все строки, идущие после «Сообщения:», были частью значения «Сообщение:», а не отдельными строками.
Пожалуйста, помогите мне решить эту проблему.
лог-файл (input.log)
Timestamp :2022-11-03 09:42:08.095
User :USER1
Type :warning
Message :Return code : EXCI_NO_ERROR 0
------------------------------------------
Timestamp :2022-11-03 09:42:08.095
User :USER1
Type :warning
Message :Abend code : 1564
------------------------------------------
Timestamp :2022-11-03 09:42:08.095
User :USER1
Type :warning
Message :Buffer received from xxx
line1
line2
line3
line4
------------------------------------------
Timestamp :2022-11-03 09:42:08.095
User :USER1
Type :warning
Message :Return code : EXCI_NO_ERROR 0
------------------------------------------
Timestamp :2022-11-03 09:42:08.095
User :USER1
Type :warning
Message :Abend code : 1564
------------------------------------------
файл конфигурации
input {
file {
path => "/etc/logstash/input.log"
start_position => "beginning"
sincedb_path => "/dev/null"
codec => multiline {
# pattern = This says that any line not starting with a '-----' should be merged with the previous line
pattern => "^-----"
negate => true
what => "previous"
}
}
}
filter {
kv {
#source => "message"
field_split => "\n"
value_split => ":"
}
}
output {
file {
path => "/etc/logstash/output.log"
}
#stdout { codec => rubydebug }
}
Сделайте шаг назад и используйте другие типы фильтров.
Ниже вы найдете одно из возможных решений.
----\n
из сообщенияinput {
file {
path => "/tmp/input.log"
start_position => "beginning"
sincedb_path => "/dev/null"
mode => "read"
codec => multiline {
# pattern = This says that any line not starting with a '-----' should be merged with the previous line
pattern => "^-+$"
negate => true
what => "previous"
}
}
}
filter {
mutate { gsub => ["message", "^-+(\n)?", ""] }
if [message] == ""{
drop {}
}
dissect {
mapping => {
"message" => "Timestamp :%{Timestamp}
User :%{User}
Type :%{Type}
Message :%{Message}"
}
}
}
output {
stdout { codec => rubydebug }
}