Nginx でカスタム アクセスおよびエラー ログ形式を構成する方法
Nginx HTTP サーバーには、高度にカスタマイズ可能な驚異的なログ機能があります。この記事では、Linux で Nginx のアクセス ログとエラー ログの形式を独自に設定する方法を説明します。
このガイドの目的は、ログがどのように生成されるかを理解し、Web サーバーおよび Web アプリケーション (リクエストのトレースなど) 内で展開される内容のデバッグ、トラブルシューティング、または分析を目的としてカスタム ログ形式を構成できるようにすることです。
こちらもお読みください: Linux 用の 4 つの優れたオープンソース ログ監視および管理ツール
この記事は 3 つのセクションで構成されており、アクセス/エラー ログの構成と、Nginx で条件付きログを有効にする方法について説明します。
Nginx でのアクセス ログの構成
Nginx では、サーバーに対するすべてのクライアント リクエストが、ngx_http_log_module モジュールを使用して指定された形式でアクセス ログに記録されます。
デフォルトのログ ファイルは log/access.log (Linux システムでは通常は /var/log/nginx/access_log) で、ログのデフォルト形式は通常、結合またはメインです。形式 (これはディストリビューションによって異なる場合があります)。
access_log ディレクティブ (場所にある場合は http、server、location に適用され、コンテキストを除く制限に適用されます) は、ログ ファイルと log_format ディレクティブ ( http コンテキストのみ) は、ログ形式の設定に使用されます。ログの形式は、共通の変数と、ログの書き込み時にのみ生成される変数によって記述されます。
ログ形式を設定するための構文は次のとおりです。
log_format format_name 'set_of_variables_to_define_format';
アクセス ログを構成するための構文は次のとおりです。
access_log /path/to/log_file format_name; #simplest form
OR
access_log /path/to/log_file [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
以下は、CentOS 7 のデフォルトの Nginx 設定ファイル /etc/nginx/nginx.conf からの抜粋です。
http {
#main log format
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log;
}
このログ形式では、次のログ エントリが生成されます。
127.0.0.1 - dbmanager [20/Nov/2017:18:52:17 +0000] "GET / HTTP/1.1" 401 188 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0"
以下は、いくつかのデフォルト変数を使用して Web アプリケーションへのリクエストを追跡するために使用するもう 1 つの便利なログ形式です。最も重要なのは、リクエスト ID と、クライアントの場所の詳細 (国、国コード、地域、都市) をログに記録することです。
log_format custom '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_x_forwarded_for" $request_id '
'$geoip_country_name $geoip_country_code '
'$geoip_region_name $geoip_city ';
次のように使用できます。
access_log /var/log/nginx/access.log custom;
これにより、次のようなログ エントリが生成されます。
153.78.107.192 - - [21/Nov/2017:08:45:45 +0000] "POST /ngx_pagespeed_beacon?url=https%3A%2F%2Fwww.example.com%2Fads%2Ffresh-oranges-1509260795 HTTP/2.0" 204 0 "https://www.suasell.com/ads/fresh-oranges-1509260795" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0" "-" a02b2dea9cf06344a25611c1d7ad72db Uganda UG Kampala Kampala
同じレベルで access_log ディレクティブを使用して複数のログを指定できます。ここでは http コンテキストで複数のログ ファイルを使用しています。
http{
##default log format
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
##request tracing using custom format
log_format custom '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_x_forwarded_for" $request_id '
'$geoip_country_name $geoip_country_code '
'$geoip_region_name $geoip_city ';
##this uses the default log format
access_log /var/log/nginx/access.log;
##this uses the our custom log format
access_log /var/log/nginx/custom_log custom;
}
次に、より高度なログ構成の例を示します。これらは、圧縮関連の変数を含むログ形式や圧縮ログ ファイルの作成に役立ちます。
access_log /var/log/nginx/custom_log custom buffer 32k;
access_log /path/to/log.gz compression gzip flush=5m;
Nginx でのエラー ログの構成
Nginx で不具合が発生した場合、その不具合に関する情報がエラー ログに記録されます。これらの問題は、デバッグ、情報、通知、警告、エラーといったさまざまな重大度レベルに分類されます。 (これはデフォルトのレベルであり、グローバルに機能します)、クリティカル、アラート、または緊急です。
デフォルトのログ ファイルは log/error.log ですが、Linux ディストリビューションでは通常 /var/log/nginx/ にあります。 error_log ディレクティブはログ ファイルを指定するために使用され、メイン、http、メール、ストリーム、サーバー、ロケーション コンテキスト (この順序) で使用できます。
次の点にも注意してください。
- メイン コンテキストの構成は、常に上記の順序で下位レベルに継承されます。
- また、下位レベルの構成は、上位レベルから継承された構成をオーバーライドします。
次の構文を使用してエラー ログを設定できます。
error_log /path/to/log_file log_level;
例えば:
error_log /var/log/nginx/error_log warn;
これにより、Nginx に対して、警告 タイプのすべてのメッセージと、より深刻なログ レベル crit、alert、および emerg のメッセージをログに記録するように指示されます。メッセージ。
次の例では、クリティカル、アラート、および緊急レベルのメッセージがログに記録されます。
error_log /var/www/example1.com/log/error_log crit;
以下の構成を考えてみましょう。ここでは、さまざまなレベル (http およびサーバー コンテキスト内) でエラー ログを定義しています。エラーが発生した場合、メッセージは、エラーが発生したレベルに最も近い 1 つのエラー ログにのみ書き込まれます。
http {
log_format compression '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" "$gzip_ratio"';
error_log /var/log/nginx/error_log crit;
server {
listen 80;
server_name example1.com;
#this logs errors messages for example1.com only
error_log /var/log/nginx/example1.error_log warn;
…...
}
server {
listen 80;
server_name example2.com;
#this logs errors messages for example2.com only
error_log /var/log/nginx/example1.error_log;
…….
}
}
以下の構成 (同じレベル) のように複数の error_log ディレクティブを使用すると、メッセージは指定されたすべてのログに書き込まれます。
server {
listen 80;
server_name example1.com;
error_log /var/www/example1.com/log/error_log warn;
error_log /var/log/nginx/example1.error_log crit;
…...
}
Nginx での条件付きログの構成
場合によっては、Nginx にメッセージの条件付きログを実行させたい場合があります。すべてのメッセージを Nginx でログに記録する必要があるわけではないため、特定のインスタンスのアクセス ログから、重要でない、またはそれほど重要ではないログ エントリを無視できます。
値が他の変数の値に依存する変数を作成する ngx_http_map_module モジュールを使用できます。マップ ブロック内のパラメーター (http コンテンツにのみ存在する必要があります) は、ソース値と結果の値の間のマッピングを指定します。
この種の設定では、条件が “0 ”
または空の文字列と評価された場合、リクエストはログに記録されません。この例では、HTTP ステータス コード 2xx および 3xx のリクエストを除外します。
http{
map $status $condition {
~^[23] 0;
default 1;
}
server{
access_log /path/to/access.log custom if=$condition;
}
}
ここでは、開発段階で Web アプリケーションをデバッグする場合に役立つ別の例を示します。これにより、すべてのメッセージが無視され、デバッグ情報のみがログに記録されます。
http{
map $info $debuggable {
default 0;
debug 1;
}
server{
……..
access_log /var/log/nginx/testapp_debug_access_log debug if=$debuggable;
#logs other requests
access_log /var/log/nginx/testapp_access.log main;
…….
}
}
syslog へのログ記録などの詳細については、こちらをご覧ください。
それは今のところすべてです!このガイドでは、Nginx でアクセス ログとエラー ログのカスタム ログ形式を構成する方法について説明しました。この記事について質問したり、意見を共有したりするには、以下のフィードバック フォームを使用してください。