アクセスログの出力設定(access_logディレクティブ)

広告

access_log ディレクティブは、サーバーへのリクエストのログをどこに出力するかや、どのような形式で記録するかを設定するためのディレクティブです。ここでは Nginx における access_log ディレクティブの使い方について解説します。

access_logディレクティブの書式

access_log ディレクティブは、サーバーへのリクエストのログをどこに出力するかや、どのような形式で記録するかを設定するためのディレクティブです。 access_log ディレクティブの書式は次の通りです。

Syntax:   access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
          access_log off;
Default:  access_log logs/access.log combined;
Context:  http, server, location, if in location, limit_except

access_log ディレクティブは httpserverlocation コンテキストの他、 iflimit_except ディレクティブで使用できます。引数としてアクセスログの保存先を指定し、フォーマットや各種オプションを追加で記述できます。

server {
  access_log アクセスログの出力先パス [フォーマット];
}

access_log は複数指定することができ、同じリクエストを複数のログに出力することもできます。

アクセスログの保存を行わない場合は、次のように記述してください。

server {
  access_log off;
}

アクセスログのフォーマットは、 log_format ディレクティブを使って定義したフォーマットを指定できます。ここでは詳しい設定方法は省略します。デフォルトでは combined フォーマットが用意されています。

log_format combined
  '$remote_addr - $remote_user [$time_local] '
  '"$request" $status $body_bytes_sent '
  '"$http_referer" "$http_user_agent"';

フォーマットとして combined を使用する場合は次のように記述します。

server {
  access_log アクセスログの出力先パス combined;
}

bufferオプション

buffer オプションが指定されていると、ログをすぐに書き込むのではなく指定したサイズになるまでメモリに貯めてから書き込みます。 buffer には貯めるメモリのサイズを指定します。

server {
  access_log アクセスログの出力先パス buffer=32k;
}

なお buffer を使用するとすぐにログが書き込まれないので、障害発生時にログが失われる可能性があります。

gzipオプション

gzip オプションが指定されていると、ログを書き込むときに圧縮が行われます。(このオプションは buffer オプションが指定されている場合のみ有効です)。 gzip オプションには圧縮のレベルを指定します。レベルは 1 から 9 で、 1 が最も早く圧縮を行い、 9 が最もサイズを小さく圧縮します。

server {
  access_log アクセスログの出力先パス buffer=32k gzip=1;
}

flushオプション

flush オプションが指定されていると、 buffer で指定したサイズになるまでログが溜まっていなくても、指定した時間が経過するとログに書き込まれます。(このオプションは buffer オプションが指定されている場合のみ有効です)。

server {
  access_log アクセスログの出力先パス buffer=32k flush=5m;
}

単位は分(m)以外にミリ秒(ms)、秒(s)、時(h)、日(d)などが使用できます。単位を省略した場合は秒として扱われます。

ifオプション

if オプションが指定されている場合、 if に設定した値が空文字または "0" の場合はログが記録されず、それ以外の場合にログが記録されます。

server {
  access_log アクセスログの出力先パス if=0;
}

この場合、 if に "0" を指定しているので常にログは記録されません。

if オプションは map ディレクティブといっしょに使用されることが多いです。

http {
  map $request_uri $loggable {
    default 1;
    ~*\.(css|js|png|jpg)$ 0;
  }

  access_log c:/nginx/logs/access.log combined if=$loggable;
}

map ディレクティブを使い、リクエストされた URI が CSS ファイル、 JS ファイル、画像ファイルへのリクエストの場合は変数 $loggable に "0" を設定し、それ以外の場合は "1" を設定しています。 access_logif に対する値として変数 $loggable を指定することで、ファイルの種類によってログを残したり残さなかったりしています。

mapディレクティブの詳しい使い方については、「変数の値に応じて別の変数を設定する(mapディレクティブ)」を参照されてください。

access_logディレクティブの設定例

Windows 環境に Nginx をインストールした場合、デフォルトでは c:/nginx/logs/access.log ファイルに保存されます。

access_logディレクティブ(1)

複数の仮想サーバを同じサーバ上で動かしている場合は、サーバごとにアクセスログを保存するファイルを分けるのが推奨されます。

http {
  server {
    server_name example.com;
    access_log c:/nginx/logs/access_example_com.log combined;
  }

  server {
    server_name example.jp;
    access_log c:/nginx/logs/access_example_jp.log combined;
  }
}

アクセスログの書き込み負荷を減らすため、バッファの設定を行います。

http {
  server {
    access_log c:/nginx/logs/access.log combined buffer=32k flush=5m;
  }
}

不要なログの記録を減らします。

http {
  map $request_uri $loggable {
    default 1;
    ~*\.(css|js|png|jpg|jpeg|gif|ico)$ 0;
  }

  access_log c:/nginx/logs/access.log combined if=$loggable;
}

サーバの負荷や必要な情報に応じて調整してみてください。

-- --

Nginx における access_log ディレクティブの使い方について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。