Nginx ログフォーマットのカスタマイズ
本番環境の監視に向けてNginxのアクセスログとエラーログのフォーマットをカスタマイズ。構造化JSONログの作成、リクエストタイミングメトリクス、ログローテーションの設定方法。
詳細な説明
適切なログ設定はトラフィックパターン、パフォーマンスボトルネック、セキュリティイベントに対する重要な可視性を提供します。カスタムログフォーマットにより、効果的な監視とトラブルシューティングに必要なデータを正確に抽出できます。
デフォルトのログフォーマット
Nginx組み込みの combined フォーマットには、クライアントIP、タイムスタンプ、リクエスト行、ステータスコード、レスポンスサイズ、リファラー、ユーザーエージェントが含まれます:
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
JSONログフォーマット
構造化JSONログは、ELK Stack、Datadog、Splunk、CloudWatchなどのログ集約ツールでのパースとインデックス作成が大幅に容易です:
log_format json_combined escape=json
'{'
'"time":"$time_iso8601",'
'"remote_addr":"$remote_addr",'
'"request":"$request",'
'"status":$status,'
'"body_bytes_sent":$body_bytes_sent,'
'"request_time":$request_time,'
'"upstream_response_time":"$upstream_response_time",'
'"http_referrer":"$http_referer",'
'"http_user_agent":"$http_user_agent"'
'}';
access_log /var/log/nginx/access.log json_combined;
escape=json パラメータにより、ログ値の特殊文字が適切にエスケープされ、有効なJSON出力が保証されます。
パフォーマンスメトリクス
遅いリクエストやバックエンドのパフォーマンス問題を特定するため、タイミング変数をログフォーマットに追加します:
$request_time:クライアントの最初のバイト受信から最後のバイト送信までの合計経過時間。$upstream_response_time:Nginxがアップストリームバックエンドサーバーのレスポンスを待った時間。$upstream_connect_time:アップストリームサーバーへのTCP接続確立にかかった時間。
条件付きログ
ヘルスチェックや監視プローブなどの既知の繰り返しリクエストをフィルタリングして、ログ量とノイズを削減します:
map $request_uri $loggable {
/health 0;
/ready 0;
default 1;
}
access_log /var/log/nginx/access.log combined if=$loggable;
サイトごとのログ
各serverブロックに個別のログファイルを使用して、個々のアプリケーションの分析とトラブルシューティングを簡素化します:
server {
server_name example.com;
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log warn;
}
エラーログレベル
エラーログの重大度レベル(最も詳細から最も簡潔の順):debug、info、notice、warn、error、crit、alert、emerg。本番環境では過度なディスク使用を避けるため warn または error を使用してください。
ログローテーション
logrotate を設定してログファイルが利用可能なディスク容量を消費し尽くすのを防ぎます。ローテーション完了後、完全な再起動なしにログファイルディスクリプタを再オープンするため、Nginxのマスタープロセスに USR1 シグナルを送信します。
ユースケース
エラーレート、遅いレスポンスタイム、トラフィック異常に対するリアルタイムアラートのため、Nginxから構造化されたパース可能なログを監視スタックに送る必要があります。