Назад | Перейти на главную страницу

Разрывы строк в трассировке стека PHP в журналах ошибок nginx мешают анализу logstash

Я использую 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