ステータスコードでnginxログを分離してみた

400番、500番のステータスコードのログのみを分けてログに出力した内容を紹介します。

今回の設定するログの分け方は、以下の通りです。

  • 全てのステータスコード(400、500番含む)→/var/log/nginx/access_logに出力
  • 400番、500番のステータスコードのみ →/var/log/nginx/access4xx5xx.logに出力

設定は以下のURLを参考にしました。

access_logからエラー解析したい [nginx]
目次 1 目的2 前提条件3 設定手順3.1 設定ファイルにフォーマットと出力条件式を記載3.2 ログ出力先の設定(ログフォーマットと出力条件)3.3 ログローテート3.4 nginx再起動3.5 ログ出力の確認4 今後やりたいこと 目的

環境

OSCentOS Stream release 9
nginxnginx/1.20.1

nginxのドキュメントルート配下に、「HELLO」というメッセージを出力するtest.htmlという名前のページを作成しています。

設定方法

nginxの設定ファイル(/etc/nginx/nginx.conf)のhttpディレクティブに以下を追記します。

http {
  ・・・
    map $status $res_status_4xx5xx {
        #レスポンスのステータスコードが4xxの場合、1をセット
        ~^[4|5] 1;

        default 0;
    }

    access_log  /var/log/nginx/access4xx5xx.log main if=$res_status_4xx5xx;

実際の設定ファイルは以下の通りです。
赤色マーカー部分が追記箇所になります。

[root@nginx-test nginx]# cat /etc/nginx/nginx.conf
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {

    map $status $res_status_4xx5xx {
        #レスポンスのステータスコードが4xxの場合、1をセット
        ~^[4|5] 1;

        default 0;
    }

    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  main;
    access_log  /var/log/nginx/access4xx5xx.log main if=$res_status_4xx5xx;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;

	# Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2;
#        listen       [::]:443 ssl http2;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers PROFILE=SYSTEM;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

}

[root@nginx-test nginx]#

設定反映のためには、nginxのサービスの再起動が必要です。

systemctl restart nginx
または
systemctl reload nginx

動作確認

curlコマンドでステータスコードが200、404となるURLへアクセスし、400/500番台のエラーのみが/var/log/httpd/access-errors.logに出力されることを確認します。

curlコマンドで以下の通り、実行します。

[root@nginx-test html]# curl http://(サーバのIPアドレス)/test.html
HELLO
[root@nginx-test html]#
[root@nginx-test html]# curl http://(サーバのIPアドレス)/test123.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
        <title>The page is not found</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <style type="text/css">
            /*<![CDATA[*/
            body {
                background-color: #fff;
                color: #000;
                font-size: 0.9em;
                font-family: sans-serif,helvetica;
                margin: 0;
                padding: 0;
            }
            :link {
                color: #c00;
            }
            :visited {
                color: #c00;
            }
            a:hover {
                color: #f50;
            }
            h1 {
                text-align: center;
                margin: 0;
                padding: 0.6em 2em 0.4em;
                background-color: #900;
                color: #fff;
                font-weight: normal;
                font-size: 1.75em;
                border-bottom: 2px solid #000;
            }
            h1 strong {
                font-weight: bold;
                font-size: 1.5em;
            }
            h2 {
                text-align: center;
                background-color: #900;
                font-size: 1.1em;
                font-weight: bold;
                color: #fff;
                margin: 0;
                padding: 0.5em;
                border-bottom: 2px solid #000;
            }
            h3 {
                text-align: center;
                background-color: #ff0000;
                padding: 0.5em;
                color: #fff;
            }
            hr {
                display: none;
            }
            .content {
                padding: 1em 5em;
            }
            .alert {
                border: 2px solid #000;
            }

            img {
                border: 2px solid #fff;
                padding: 2px;
                margin: 2px;
            }
            a:hover img {
                border: 2px solid #294172;
            }
            .logos {
                margin: 1em;
                text-align: center;
            }
            /*]]>*/
        </style>
    </head>

    <body>
        <h1><strong>nginx error!</strong></h1>

        <div class="content">

            <h3>The page you are looking for is not found.</h3>

            <div class="alert">
                <h2>Website Administrator</h2>
                <div class="content">
                    <p>Something has triggered missing webpage on your
                    website. This is the default 404 error page for
                    <strong>nginx</strong> that is distributed with
                    Red Hat Enterprise Linux.  It is located
                    <tt>/usr/share/nginx/html/404.html</tt></p>

                    <p>You should customize this error page for your own
                    site or edit the <tt>error_page</tt> directive in
                    the <strong>nginx</strong> configuration file
                    <tt>/etc/nginx/nginx.conf</tt>.</p>

                    <p>For information on Red Hat Enterprise Linux, please visit the <a href="http://www.redhat.com/">Red Hat, Inc. website</a>. The documentation for Red Hat Enterprise Linux is <a href="http://www.redhat.com/docs/manuals/enterprise/">available on the Red Hat, Inc. website</a>.</p>

                </div>
            </div>

            <div class="logos">
                <a href="http://nginx.net/"><img
                    src="nginx-logo.png"
                    alt="[ Powered by nginx ]"
                    width="121" height="32" /></a>
                <a href="http://www.redhat.com/"><img
                    src="poweredby.png"
                    alt="[ Powered by Red Hat Enterprise Linux ]"
                    width="88" height="31" /></a>
            </div>
        </div>
    </body>
</html>
[root@nginx-test html]#

デフォルトのアクセスログ(/var/log/nginx/access_log)は以下の通りです。

[root@nginx-test html]# cat /var/log/nginx/access.log
(サーバのIPアドレス) - - [xx/Dec/2024:12:50:45 +0900] "GET /test.html HTTP/1.1" 200 6 "-" "curl/7.76.1" "-"
(サーバのIPアドレス) - - [xx/Dec/2024:12:51:16 +0900] "GET /test123.html HTTP/1.1" 404 3971 "-" "curl/7.76.1" "-"
[root@nginx-test html]#

400/500番台エラーのみ出力するアクセスログ(/var/log/nginx/access4xx5xx.log)は以下の通りです。

[root@nginx-test html]# cat /var/log/nginx/access4xx5xx.log
(サーバのIPアドレス) - - [xx/Dec/2024:12:51:16 +0900] "GET /test123.html HTTP/1.1" 404 3971 "-" "curl/7.76.1" "-"
[root@nginx-test html]#

正常に特定のステータスコードのみ出力されていることが分かります。

まとめ

今回は、mapを利用して、nginxログの特定のステータスコードのみをログに出力する設定を紹介しました。

ご参考になれば、幸いです。

以上になります。ありがとうございました。

コメント

タイトルとURLをコピーしました