В прошлом уроке 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 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.