Раздел 40 · Elasticsearch и ELK

Filebeat подробно: входы и модули

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

В прошлом уроке Filebeat прочитал строки access-лога и отправил их как есть. На настоящем сервере «Гонца» логов больше, и они разные: текстовый лог Java со стектрейсами в несколько строк, JSON-логи сервисов, проверки здоровья, которые никому не нужны. Разберём, как настроить Filebeat под каждый случай.

Устройство конфига

Конфиг Filebeat это файл filebeat.yml в формате YAML. Две главные части:

filebeat.inputs:        # откуда читать
  - type: filestream
    id: nginx-access
    paths:
      - /var/log/nginx/access.log

output.logstash:        # куда отправлять
  hosts: ["logstash:5044"]

Каждый вход начинается с type. Для файлов логов это filestream. У каждого входа должен быть свой уникальный id: по нему Filebeat хранит, до какого места прочитан каждый файл. В paths можно писать маски: /var/log/gonets/*.log прочитает все логи сервисов сразу.

Выход один на весь Filebeat: output.logstash, output.elasticsearch, output.kafka или output.console для отладки.

Где Filebeat хранит прогресс

Filebeat ведёт реестр: для каждого файла запоминает, сколько байт уже отправлено. Смещение строки видно в поле log.offset. Перезапустили агент, и он продолжит с запомненного места, а не начнёт файл заново. Когда файл ротируется, например access.log переименовали в access.log.1 и начали новый, Filebeat узнаёт старый файл по его идентификатору в системе и дочитывает хвост.

Строки, которые продолжают друг друга

Стектрейс Java занимает много строк, но это одна ошибка. Если отправить каждую строку отдельным событием, в Kibana ошибка рассыплется на десяток записей, и строка at ru.gonets.payments.BankGatewayClient.authorize окажется без контекста.

Собрать их обратно помогает парсер multiline:

parsers:
  - multiline:
      type: pattern
      pattern: '^\d{4}-\d{2}-\d{2} '
      negate: true
      match: after

Читается так: строки, которые не (negate: true) начинаются с даты, приклеиваются после (match: after) предыдущей. Новая запись лога всегда начинается с даты, а строки стектрейса с at или Caused by.

JSON-логи

Если сервис пишет структурированные логи по строке JSON, Filebeat может разобрать их сам парсером ndjson. С настройкой target: "" ключи JSON лягут прямо в корень события, а add_error_key: true пометит сломанные строки полем error.message.

урок из курса

Урок из курса «Elasticsearch и ELK». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.