ログファイル分析として、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で処理するか、エラーメッセージをフォーマットして改行を削除するにはどうすればよいですか?
@USDへの称賛-彼のヒントのおかげでマットはどこを見ればよいかわかりました。それが解決策です。
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