Ведение журнала с помощью filebeat — извлечение полей ECS из многострочного файла json

#elasticsearch #filebeat #kibana-7

Вопрос:

У меня есть log4net json журнал, в котором поле сообщения может быть разделено на несколько строк при регистрации стека с сообщением.

Пример:

 {"@timestamp":"2021-11-12 17:54:09,517","event.dataset":"app.access","thread":"[30]","Level":"ERROR","Message":"MySqlConnector.MySqlException (0x80004005): Access denied for user 'root'@'someplace' (using password: YES)
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()... "}
 

Filebeat правильно анализирует обе строки как одно событие, но я не могу заставить его заполнить ECS event.dataset из файла.

Здесь соответствующая часть filebeat.yml:

 filebeat.inputs:
- type: log
  enabled: true

  paths:
    - d:logs*.log
  multiline.pattern: '^{'
  multiline.negate: true
  multiline.match:  after
 
processors:
  - decode_json_fields:
      fields: ["message","event.dataset"]
      target: "json"
 

Чего не хватает для того, чтобы filebeat смог извлечь event.dataset поле из файла?

Обновить

Я смог успешно проанализировать поля ECS и поля, отличные от ECS, из одной строки журнала с помощью этой более простой конфигурации:

 filebeat.inputs:
- type: log
  enabled: true

  paths:
    - d:logs*.log

  multiline.pattern: '^{'
  multiline.negate: true
  multiline.match:  after

  json.keys_under_root: true
  json.add_error_key: true
  json.message_key: message
 

Но не удается извлечь какое-либо поле, когда строка журнала охватывает несколько строк. Отчет по ключам ошибок:

  • ошибка.сообщение: Ошибка при декодировании JSON: недопустимый символ «a» , ищущий начало значения
  • ошибка.тип: json

запись в журнале:

 {"entry":"2021-11-15 11:31:47,954","event.dataset":"someapp","thread":"[72]","Level":"ERROR","message":"MySqlConnector.MySqlException (0x80004005): Access denied for user 'someuser' (using password: YES)
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
 

Комментарии:

1. вы используете Logstash ? или вы отправляете журналы непосредственно в elasticsearch?

2. Я использую logstash.

3. примените фильтр json, а затем используйте поле event.dataset в elasticsearch

4. Вы имеете в виду определение полей decode_json_fields для процессора? Если да, то не повлияет ли это на другие отслеживаемые файлы? Это мой первый раз с logstash.

5. смотрите Шаблоны Logstash grok, вы можете определить шаблон, чтобы захватить каждый параметр из неструктурированного журнала