🌐

Nginxのアクセスログのフォーマット形式を変更する

に公開

1. はじめに

Nginxのアクセスログは、サーバーへのリクエスト状況やトラブルシュートに欠かせない情報源です。デフォルトでもある程度の情報は出力されますが、プロジェクトによっては「JSON形式で出力したい」「特定のヘッダーを記録したい」「分析ツールに合わせた形式にしたい」といったニーズも出てくるはずです。

この記事では、Nginxのアクセスログのフォーマットを自由にカスタマイズする方法について、具体例とともに解説します。設定の書き方から再起動手順まで、初めて触る方でもスムーズに対応できるよう丁寧にまとめています。

2. Nginxのアクセスログについて

2.1. デフォルトの出力先

Nginxのログは、デフォルトでは以下のディレクトリに出力されます。

  • アクセスログ
/var/log/nginx/access.log
  • エラーログ
/var/log/nginx/error.log

2.2. デフォルトの出力形式

Nginxのアクセスログは、デフォルトでは以下の形式で出力されます。

127.0.0.1 - - [19/Apr/2025:14:32:12 +0900] "GET /index.html HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"

これはcombinedフォーマットと呼ばれる形式で以下のように定義されています。

log_format combined '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';
フィールド名 内容例 説明
$remote_addr 127.0.0.1 アクセス元IPアドレス
$remote_user - Basic認証などのユーザー(使用していない場合-)
$time_local [19/Apr/2025:14:32:12 +0900] ローカル時間
$request GET /index.html HTTP/1.1 リクエスト行
$status 200 HTTPステータスコード
$body_bytes_sent 612 レスポンスサイズ(バイト)
$http_referer "-" 参照元URL
$http_user_agent Mozilla/5.0 ... ブラウザ情報など

3. Nginxログの出力形式を変更する

3.1. 設定ファイルの編集

Nginxのアクセスログの表示形式はnginx.confまたはconf.d/default.confのような設定ファイルに、log_formatディレクティブを使用してカスタムフォーマットを定義し、access_logに指定することによって変更することが出来ます。

http {
    ; ログのフォーマットを定義
    log_format json_format escape=json
        '{'
        '"time":"$time_local",'
        '"remote_addr":"$remote_addr",'
        '"request":"$request",'
        '"status":$status,'
        '"body_bytes_sent":$body_bytes_sent,'
        '"referer":"$http_referer",'
        '"user_agent":"$http_user_agent"'
        '}';

    ; ここでaccess_logに上記で定義したフォーマットを適応
    access_log /var/log/nginx/access.log json_format;
}

3.2. 設定ファイルの構文チェック

アクセスログの出力定義を設定し終わった後は、書き方に誤りがないかどうかを確認するために以下のコマンドを実行してください。

nginx -t

以下のように出力された場合は設定ファイルに問題がないため、Nginxをリロード・再起動しても大丈夫です。

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

以下のように出力された場合は構文エラーが発生しているので、エラー出力を参考に設定ファイルを修正してください。

nginx: [emerg] unknown directive "log_formatxxx" in /etc/nginx/nginx.conf:10
nginx: configuration file /etc/nginx/nginx.conf test failed

3.3. Nginx再起動

以下のコマンドでNginxを再起動してください。

sudo systemctl restart nginx

再起動後、実際に出力されたログを開き、設定が反映されているかどうかを確認してください。

4. ログの設定例

4.1. JSON形式で出力

ログをFluentdやDatalogなどのログ収集ツールで処理したい場合など

http {
    log_format json_format escape=json
      '{'
        '"time":"$time_local",'
        '"remote_addr":"$remote_addr",'
        '"method":"$request_method",'
        '"uri":"$request_uri",'
        '"status":$status,'
        '"body_bytes_sent":$body_bytes_sent,'
        '"referer":"$http_referer",'
        '"user_agent":"$http_user_agent"'
      '}';

    access_log /var/log/nginx/access.log json_format;
}

出力例:

{"time":"19/Apr/2025:14:45:22 +0900","remote_addr":"192.168.1.1","method":"GET","uri":"/index.html","status":200,"body_bytes_sent":512,"referer":"-","user_agent":"Mozilla/5.0 ..."}

4.2. API向けの最小構成

内部APIサーバーなどでログをスリムにしたい場合

http {
    log_format api_minimal '$request_method $request_uri $status $request_time';
    
    access_log /var/log/nginx/access.log api_minimal;
}

出力例:

POST /api/login 200 0.032

4.3. パフォーマンス分析用途

応答速度や処理時間の分析用ログが必要な場合

http {
    log_format perf_format '$remote_addr [$time_local] '
                           '"$request" $status $body_bytes_sent '
                           'request_time=$request_time upstream_time=$upstream_response_time';
    
    access_log /var/log/nginx/access.log perf_format;
}
フィールド名 説明
request_time クライアントがリクエストしてからの処理時間(秒)
upstream_request_time バックエンドからの応答時間(リバースプロキシ利用時

出力例:

192.168.1.1 [19/Apr/2025:14:46:11 +0900] "GET /product/123 HTTP/1.1" 200 1234 request_time=0.152 upstream_time=0.150

4.4. セキュリティ監査ログ用

不審なアクセスや攻撃調査用にリクエストヘッダーやクッキーなどを詳しく記録

http {
    log_format security_audit '$remote_addr - [$time_local] '
                              '"$request" $status '
                              'Referer="$http_referer" '
                              'UserAgent="$http_user_agent" '
                              'Cookie="$http_cookie"';
    
    access_log /var/log/nginx/access.log security_audit;
}

出力例:

203.0.113.5 - [19/Apr/2025:14:50:03 +0900] "GET /admin HTTP/1.1" 403 Referer="-" UserAgent="curl/7.68.0" Cookie="PHPSESSID=xyz..."

4.5. 独自セッション・トラッキング用(任意ヘッダー付き)

アプリが X-Session-ID ヘッダーを送信している場合にその値をログに記録

http {
   log_format session_tracking '$remote_addr - [$time_local] "$request" '
                               'status=$status session="$http_x_session_id"';
   
   access_log /var/log/nginx/access.log session_tracking;
}
フィールド名 説明
$http_x_xxx 任意のHTTPヘッダー(例:$http_x_session_id)

出力例:

127.0.0.1 - [19/Apr/2025:15:00:10 +0900] "GET /home HTTP/1.1" status=200 session="abc123xyz"

5. 終わりに

以上がNginxのアクセスログ形式の変更方法です。他にもさまざま値を出力することができるので、詳しく知りたい方は公式のドキュメントを確認してみてください。
https://nginx.org/en/docs/varindex.html

Discussion