Server

[nginx] ログを json形式で書き出す設定

アクセスログをCloudWatchなどに出す場合にjson形式にすると便利なため、nginxのアクセスログをjson形式で出すようにします。
また4xxや5xxなどのステータスコードの場合もjsonで書き出すことで判定が楽になるかと思います。

  • nginx.conf
http {
    ...中略...

    # ログファイルの設定
    # ログファイルのフォーマットをjson形式に設定
    log_format json escape=json '{'
                                '"time":"$time_iso8601",'
                                '"host":"$remote_addr",'
                                '"port":"$remote_port",'
                                '"method":"$request_method",'
                                '"uri":"$request_uri",'
                                '"status":"$status",'
                                '"body_bytes":"$body_bytes_sent",'
                                '"referer":"$http_referer",'
                                '"ua":"$http_user_agent",'
                                '"request_time":"$request_time",'
                                '"respons_time":"$upstream_response_time"'
                                '}';
    # 40x系のログを出力するための変数を設定
    map $status $res_status_4xx {
        ~^[4] 1;
        default 0;
    }
    # 50x系のログを出力するための変数を設定
    map $status $res_status_5xx {
        ~^[5] 1;
        default 0;
    }

    # access.logにjson形式で出力
    access_log /var/log/nginx/access.log json;

    # エラーログを出力
    access_log /var/log/nginx/error4xx.log json if=$res_status_4xx;
    access_log /var/log/nginx/error5xx.log json if=$res_status_5xx;
  
   ...中略...
}

log_format」に「json」の内容を定義して、それを「access_log」に設定します。
またステータスが4xxや5xxの場合も分けて定義することでエラー時のログが特定しやくなります。