LogFormatディレクティブ:ログファイルのフォーマットを定義する

Apache では Apache で起動している Web サーバにアクセスしてきたユーザーのログを残すことができますが、ユーザーの情報の中からどのようなデータをログとして残すのかについてログのフォーマットを定義することができます。ここでは Apache のログファイルで使用するフォーマットを設定する方法について解説します。

(Last modified: )

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

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

LogFormat フォーマットの定義 フォーマット名

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

フォーマットは複数定義しておくことができ、ログの保存場所を指定する CustomLog ディレクティブの設定でどのフォーマットを使ってログを記録していくのかを指定することができます。

※ CustomLog ディレクティブについては「CustomLogディレクティブ:ログファイルの名前と使用するフォーマットを選択する」を参照されてください。

フォーマットの定義は次の設定項目を組み合わせて行います。

設定値意味
%%パーセント記号(%)そのもの
%aアクセス元のIPアドレス
%Aサーバ(Apache)のIPアドレス
%B送信されたバイト数(ヘッダーは含まず)
%b送信されたバイト数(ヘッダーは含まず)。0バイトの時は「-」
%Dリクエストの処理時間(マイクロ秒単位)
%fリクエストされたファイル名
%hアクセス元のホスト名
%Hリクエストのプロトコル名
%lクライアントの識別子
%mリクエストのメソッド名
%pポート番号
%PプロセスID
%qリクエストに含まれるクエリー文字列。空白以外は「?」が付く
%rリクエストの最初の行の値
%sレスポンスステータス
%>s最後のレスポンスのステータス
%tリクエストを受け付けた時刻
%T処理にかかった時間(秒単位)
%u認証ユーザー名
%UリクエストのURLパス
%vリクエストに対するバーチャルホスト名
%VUseCanonicalNameによるサーバ名
%X接続ステータス
%{クッキー名}Cリクエストに含まれるクッキーの値
%{環境変数名}e環境変数名の値
%{ヘッダー名}iリクエストに含まれるヘッダー名の値
%{ヘッダー名}oレスポンスに含まれるヘッダー名の値
%{メモ}nモジュールから渡されるメモの値
%{フォーマット}tフォーマットされたリクエストを受け付けた時刻

logio_module モジュールが利用できる場合は次のフォーマットも使用できます。

設定値意味
%I受け取ったバイト数
%O送信したバイト数

これらの項目を列挙しダブルクォーテーション(")で囲って指定します。フォーマット中にダブルクォーテーションを記述する場合は「\」でエスケープして記述します。

項目の中には {} で囲んで記述される項目があります。例えば %{ヘッダー名}i はヘッダーの中からヘッダー名に指定した値だけを取り出して記録します。 %{User-Agent}i と記述した場合にはヘッダーの中の User-Agent の値を保存します。

例えば「アクセス元のIPアドレス」「リクエストされたファイル名」「レスポンスステータス」だけが必要であれば、 LogFormat ディレクティブを使って次のようなフォーマットを httpd.conf に記述してください。

LogFormat "%a %f %s" mylogformat

httpd.conファイルでの記述

httpd.conf ファイルではデフォルト次の 2 のフォーマットが定義されています。

<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>

</IfModule>

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

ログのフォーマットとして common および combined 、そして logio_module が利用できる場合には combinedio も使用できます。

common フォーマットは次のような構成になっています。ログの保存として common を指定した場合はこれらの情報が 1 行で記録されていきます。

%h    アクセス元のホスト名
%l    クライアントの識別子
%u    認証ユーザー名
%t    リクエストを受け付けた時刻
\%r\  リクエストの最初の行の値
%>s   最後のレスポンスのステータス
%b    送信されたバイト数

combined フォーマットは common フォーマットに次のような項目が追加されています。

\%{Referer}i\     リファラー
\%{User-Agent}i\  User Agent

combinedio フォーマットは combined フォーマットに次のような項目が追加されています。

%I  受け取ったバイト数
%O  送信したバイト数

これらのデフォルトで用意されているログのフォーマットを使用してもいいですし、新しくフォーマットを定義して使用することもできます。

デフォルトの設定では httpd.conf ファイルで CustomLog ディレクティブで common フォーマットが指定されています。

<IfModule log_config_module>

    #
    # 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

</IfModule>

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

アクセスログには指定した common フォーマットでログが残っています。

LogFormatディレクティブの使い方(3)

新しいフォーマットを定義する

それでは新しいフォーマットを定義してみます。フォーマット名は simple で、アクセス元のIPアドレスとリクエストされたファイル名だけをログに残します。

LogFormat "%a %f" simple

httpd.conf に先ほどの 1 行を追加し、 CustomLog ディレクティブに simple を指定します。

新しいフォーマットを定義する(1)

httpd.conf を保存し、 Apache を再起動します。そのあとで http://localhost/blog/index.html へアクセスします。

新しいフォーマットを定義する(2)

ログを確認するために /logs/access.log のファイルを開いてみます。ログファイルの最後に、新しく指定したフォーマットでログが記録されているのが確認できます。

新しいフォーマットを定義する(3)

-- --

Apache のログファイルで使用するフォーマットを設定する方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

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