Эластичный logstash многострочный + значение ключа, когда один из ключей (сообщение) состоит из более чем одной строки

У меня есть следующий файл журнала, каждая запись 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 }
}

0
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

тлдр;

Сделайте шаг назад и используйте другие типы фильтров.

Ниже вы найдете одно из возможных решений.

Решение

  1. Мутировать, удалить ----\n из сообщения
  2. Удалить пустое сообщение
  3. Разбейте сообщение на нужные поля
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 }
}

Другие вопросы по теме