nginx 错误日志中 PHP 堆栈跟踪的换行符干扰了 logstash 分析

nginx 错误日志中 PHP 堆栈跟踪的换行符干扰了 logstash 分析

我正在使用带有 PHP-FPM 和 ELK 的 nginx 作为日志文件分析。

当 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 处理这些换行符或格式化这些错误消息以删除换行符?

答案1

感谢@USD-Matt 的提示,我现在知道该看哪里了,这就是解决方案:

ELK 堆栈中有一个多行功能。但是当我使用filebeat 模块要对日志进行后处理,我不能仅仅像上面提到的那样激活 logstash 中的多行功能。

我必须在文件节拍本身(/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*

答案2

我已经有一段时间没用过 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

相关内容