ウェブサイト検索

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 に対して、警告 タイプのすべてのメッセージと、より深刻なログ レベル critalert、および 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 でアクセス ログとエラー ログのカスタム ログ形式を構成する方法について説明しました。この記事について質問したり、意見を共有したりするには、以下のフィードバック フォームを使用してください。