アクセス先のサブドメインに応じてnginxのログの出力先を変更する方法


背景

負荷テストを実施し、kataribeを用いてnginxのログ解析を行う必要がありました。
ただデフォルトだと、すべてのアクセスログが同じファイルに集約されてしまうため、対象のログだけを解析するのは結構めんどくさそうやなーと思っていました。

そこで、特定のサブドメインに対するアクセスのみ、そのログの出力先を別のファイルにできればええんちゃう?という助言をいただいたので、やり方を調べてみました。

やりたいこと

特定のサブドメインに対するアクセスがあった場合に、そのアクセスログの出力先を別のファイルに向けてやること

やり方

nginx.confのhttp{}のブロックに以下のコードを追加します。

  map $request $test {
    ~.*dummy.* 1;
    default 0;
  }

  map $request $normal {
    ~.*dummy.* 0;
    default 1;
  }

正規表現を用いて、dummyというサブドメインへのアクセスか否かを判定しています。
$requestがdummyというサブドメインを含んでいるか否かで、それぞれ対応した結果が変数testとnormalに格納されます。
この二つの変数を用いてログの出力先を調整します。

次に、アプリケーションのconfファイルのserver{}ブロックに以下のコードを追加します。

access_log  /hogehoge/logs/access.log main if=$normal;
access_log  /hogehoge/logs/dummy/access.log main if=$test;

このように設定すれば、サブドメインdummyへのアクセスのログはdummyディレクトリ下のaccess.logに書き込まれます。
これで特定のサブドメインに対するアクセスログだけを別ファイルに抽出できたので、思う存分ログ解析できそうです。

他にも$user_agentなどを指定すれば、特定のユーザエージェントからのアクセスのみうんたらかんたらとかもできそうですね。

注意点

access_log  /hogehoge/nginx/logs/access.log main if=$normal;
access_log  /hogehoge/nginx/logs/dummy/access.log main if=$test;

こういうif文が使えるのはnginxの1.7系以上だそうです。