我正在使用带有 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