CustomLogディレクティブ:ログファイルの名前と使用するフォーマットを選択する

Apache では Web サーバへアクセスしたきたクライアントの情報をあらかじめ設定したフォーマットでログとして記録しています。ここでは CustomLog ディレクティブを使って Apache で記録されるログを保存するファイルの名前、およびログのフォーマットを設定する方法について解説します。 CustomLog ディレクティブを複数記述することで、複数のログファイルにログを記録していくこともできます。

(Last modified: )

CustomLogディレクティブの使い方

ログファイルの名前およびログのフォーマットを設定するには CustomLog ディレクティブを使用します。書式は次のとおりです。

CustomLog ログファイル名 フォーマット名 [env=[!]環境変数名]
CustomLog ログファイル名 フォーマットの定義 [env=[!]環境変数名]

記述できる場所は httpd.conf, VirtualHost です。

ログファイルの名前は ServerRoot からの相対パスを使って指定します。例えば ServerRoot のディレクトリの中の logs ディレクトリにある access.log という名前にする場合、ログファイル名は logs/access.log となります。( ServerRoot については「ServerRootディレクティブ:相対パスの起点となるApacheがインストールされているディレクトリ」を参照されてください)。

ログのフォーマットは事前に LogFormat ディレクティブを使って定義したフォーマット名を指定するか、または LogFormat ディレクティブと同じ書式を使って直接指定することもできます。次の 2 つは同じ結果となります。

LogFormat "%h %l %u" mylog
CustomLog logs/access.log mylog
CustomLog logs/access.log "%h %l %u"

LogFormat ディレクティブおよびログのフォーマットを定義する書式の使い方については「LogFormatディレクティブ:ログファイルのフォーマットを定義する」を参照されてください。

なお CustomLog ディレクティブを複数記述すると複数のログファイルにログを記録することができます。

LogFormat "%h %l %u" mylog
CustomLog logs/simple.log mylog
CustomLog logs/access.log "%h %l %u %t \"%r\" %>s %b"

httpd.conファイルでの記述

httpd.conf ファイルではデフォルトで次のように記述されれています。

<IfModule log_config_module>
    #
    # The following directives define some format nicknames for use with
    # a CustomLog directive (see below).
    #
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      # You need to enable mod_logio.c to use %I and %O
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>

    #
    # The location and format of the access logfile (Common Logfile Format).
    # If you do not define any access logfiles within a <VirtualHost>
    # container, they will be logged here.  Contrariwise, if you *do*
    # define per-<VirtualHost> access logfiles, transactions will be
    # logged therein and *not* in this file.
    #
    CustomLog "logs/access.log" common

    #
    # If you prefer a logfile with access, agent, and referer information
    # (Combined Logfile Format) you can use the following directive.
    #
    #CustomLog "logs/access.log" combined
</IfModule>

LogFormat ディレクティブを使って common と combined の 2 つのログフォーマットを定義したあとで、 CustomLog ディレクティブを使ってログファイルの名前として "logs/access.log"、ログのフォーマットとして common を設定しています。

実際のファイルを確認してみると次のようにアクセスログが記録されていることが確認できます。

CustomLogディレクティブの使い方(1)

CustomLogディレクティブの使い方(2)

指定した環境変数が定義されている場合にだけログを記録する

CustomLog ディレクティブの 3 番目の引数を指定することで、指定した環境変数が定義されている場合だけログを記録します。環境変数名の前に ! を付けた場合は環境変数が定義されていない場合だけログを記録します。

CustomLog ログファイル名 フォーマット名 env=環境変数名
CustomLog ログファイル名 フォーマット名 env=!環境変数名

環境変数の定義は SetEnvIf ディレクティブなどを使って設定します。例えばリファラーに www.example.com が含まれていたら環境変数 nolog を定義し、環境変数 nolog が含まれていたらログを記録しない場合は次のように記述します。

SetEnvIf Referer "www\.example\.com" nolog
CustomLog logs/access.log common env=!nolog

※ SetEnvIf ディレクティブの使い方については「SetEnvIfディレクティブ:リクエストに含まれる情報に基づいて環境変数を設定する」を参照されてください。

-- --

CustomLog ディレクティブを使って Apache で記録されるログを保存するファイルの名前、およびログのフォーマットを設定する方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

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