Linux

[Tips]Nginxで特定のログを除外する方法

nginxで特定のログを除外する方法ですが、少々ハマったので紹介します。

基本的にドキュメントに書いています。

Module ngx_http_log_module
Module ngx_http_log_module

nginx.org

Ubuntuを立ち上げaptでnginxを導入した場合には、そもそも log_formatmain は存在せず、combined になります。
いつ頃からなんだろう・・・。

そのためググって出てくるログの除外の方法に書かれているものはnginx起動に失敗します。

次に ~ (チルダ)です。

nginx.conf などの設定では ~ (チルダ)が付く場合は正規表現の文字列となります。

以上を踏まえてAzureのFront DoorとロードバランサーのログをUser-Agentをもとに除外する場合を説明していきます。

書式はmapを使用します。

map $status[比較するもの] # $loggable[比較対象] {
    ~^[23]  0; 除外したい文字列
    default 1; それ以外を書き込む
}

access_log /path/to/access.log combined if=$loggable;
アクセスログに設定したログに上記のmap($lggable)を適用して書き込む

通常の文字列として判定する場合。

/etc/nginx/nginx.conf

        map $http_user_agent $log_poring {
                "Load Balancer Agent" 0;
                'Edge Health Probe' 0;
                default 1;
        }
        access_log /var/log/nginx/access.log combined if=$log_poring;

通常の文字列として扱う場合は、そのまま空白なく書くか、 ""(ダブルクォーテーション)もしくは''(シングルクォーテーション)で囲います。

下記は正規表現を利用して除外する場合です。

/etc/nginx/nginx.conf

        map $http_user_agent $log_poring {
                "Load Balancer Agent" 0;
                ~Edge\sHealth\sProbe 0;
                default 1;
        }
        access_log /var/log/nginx/access.log combined if=$log_poring;

~Edge\sHealth\sProbe の部分が正規表現で書かれています。\s はスペースです。
 
また、これらは全文一致ではなく部分一致であることにも注意が必要です。前方一致を行いたい場合などは正規表現で記述が必要です。

利用したいログの内容は下記を参考にするとよいと思います。

参考になれば。

-Linux
-, ,