Я использую nginx с PHP-FPM и ELK для анализа файлов журнала.
Когда сценарий PHP вызывает ошибку, интерпретатор отправляет ошибку обратно в nginx, а nginx помещает ошибку в файл error.log.
Проблема: иногда эти журналы ошибок содержат разрывы строк который не может обработать logstash, потому что разрывы строк считаются новой строкой журнала.
2019/04/17 19:23:00 [error] 8356#8356: *4403 FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught Error: Call to undefined function wp_using_themes() in /htdocs/wp-includes/template-loader.php:7
Stack trace:
#0 /htdocs/wp-blog-header.php(19): require_once()
#1 /htdocs/index.php(17): require('/htdocs/wp-blog...')
#2 {main}
thrown in /htdocs/wp-includes/template-loader.php on line 7" while reading response header from upstream, client: 123.123.123.123, server: foobar.de, request: "GET /2014/11/foobar/ HTTP/1.1", upstream: "fastcgi://unix:/run/php/php-fpm-foobar.sock:", host: "foobar.de"
Как мне обработать эти разрывы строк с помощью logstash или отформатировать эти сообщения об ошибках, чтобы удалить разрывы строк?
Престижность @ USD-Matt благодаря его подсказке, теперь я знаю, где смотреть, и вот решение:
В стеке ELK есть многострочная функция. Но поскольку я использую модуль filebeat для постобработки журналов я не могу просто активировать многострочную функцию в logstash, как упоминалось выше.
Я должен включить это в filebeat сам (/etc/filebeat/filebeat.yml) как описано здесь: https://www.elastic.co/guide/en/beats/filebeat/master/multiline-examples.html
Но внимание: я также использую модуль filebeat "nginx" который утверждает, что решает саму многострочную проблему. Это не так. Вы можете заставить его сделать это, добавив вышеуказанные многострочные настройки в файл конфигурации модуля: /etc/filebeat/modules.d/nginx.yml
Я так и сделал, и вот как теперь выглядит конкретная часть:
error:
enabled: true
input:
multiline.pattern: '^\d{4}\/\d{2}\/\d{2}'
multiline.negate: true
multiline.match: after
var.paths:
- /var/nginx/foobar_de/logs/error.log*
Я давно не использовал ELK, но вам нужно изменить конфигурацию для поддержки многострочных записей журнала. Ниже приведен пример использования многострочного кодека для объединения любых строк, которые не начинаются с даты, взятый из официальной документации.
input {
file {
path => "/var/log/someapp.log"
codec => multiline {
# Grok pattern names are valid! :)
pattern => "^%{TIMESTAMP_ISO8601} "
negate => true
what => "previous"
}
}
}
Обратите внимание, что я не уверен, использует ли ваш файл журнала даты ISO8601, как в примере, без фактического исследования этого формата, поэтому вы не сможете использовать этот пример как есть, но он показывает основы обработки записей многострочного журнала, где дата означает новую запись.
https://www.elastic.co/guide/en/logstash/current/plugins-codecs-multiline.html