アクセスログ
サーバアクセスログは、サーバによって処理されたすべてのリクエストを記録します。 アクセスログの場所と内容は、CustomLog
ディレクティブによって制御されます。 LogFormat
ディレクティブは、ログの内容の選択を簡素化するために使用できます。 この設定方法を説明し、サーバの記録情報にアクセスログにあります。もちろん、アクセスログに情報を格納することは、ログ管理の始まりに過ぎません。, 次のステップは、この情報を分析して有用な統計を生成することです。 一般に、ログ分析はこのドキュメントの範囲を超えており、実際にはwebサーバー自体の仕事の一部ではありません。 このトピックの詳細およびログ分析を実行するアプリケーションについては、Open Directoryを参照してください。
Apacheの様々なバージョンでは、mod_log_referer、mod_log_agent、TransferLog
ディレクティブを含む、他のモジュールとディレクティブを使用してアクセスログを制御しています。, CustomLog
ディレクティブは、古いすべてのディレクティブの機能を包含するようになりました。
アクセスログのフォーマットは高度に設定可能です。 書式指定は、Cスタイルのprintf(1)書式指定文字列とよく似た書式指定文字列を使って行われます。 いくつかの例を次のセクションで紹介します。 書式指定文字列の可能な内容の完全なリストについては、mod_log_config
書式指定文字列を参照してください。
共通ログフォーマット
アクセスログの一般的な設定は次のようになります。,
LogFormat "%h %l %u %t \"%r\" %>s %b" commonCustomLog logs/access_log common
これはニックネームを定義しますcommon
特定のログ書式文字列に関連付けます。 書式文字列はpercentディレクティブで構成され、それぞれが特定の情報をログに記録するようにサーバに指示します。 リテラル文字は書式文字列に配置することもでき、ログ出力に直接コピーされます。 引用符文字("
)は、書式文字列の末尾として解釈されないように、その前に円記号を配置してエスケープする必要があります。, 書式文字列には、改行の場合は特殊制御文字”\n
“、タブの場合は”\t
“を含めることもできます。
CustomLog
ディレクティブは、定義されたニックネームを使用して新しいログファイルを設定します。 アクセスログのファイル名は、スラッシュで始まらない限り、ServerRoot
を基準にしています。
上記の設定では、Common Log Format(CLF)と呼ばれる形式でログエントリを書き込みます。 この標準フォーマットにより製造することができ多くの異なるウェブサーバに読み込多くのログ解析プログラム., CLFで生成されるログファイルエントリは次のようになります。
127.0.0.1 - frank "GET /apache_pb.gif HTTP/1.0" 200 2326
このログエントリの各部分は以下のようになります。
127.0.0.1
(%h
)これは、サーバーに要求を行ったクライアント(リモートホスト)のIPアドレスです。 HostnameLookups
がOn
に設定されている場合、サーバーはホスト名を特定し、IPアドレスの代わりにログインしようとします。 ただし、サーバーが大幅に遅くなる可能性があるため、この構成は推奨されません。, 代わりに、logresolve
のようなログポストプロセッサを使用してホスト名を決定することをお勧めします。 ここで報告されるIPアドレスは、必ずしもユーザが座っているマシンのアドレスではありません。 ユーザーとサーバーの間にプロキシサーバーが存在する場合、このアドレスは元のマシンではなくプロキシのアドレスになります。 -
(%l
)出力の”ハイフン”は、要求された情報が利用できないことを示します。, この場合、利用できない情報は、クライアントマシン上のidentd
によって決定されるクライアントのRFC1413idです。 これらの情報は信頼できないときないケースがほとんど使用する以外にしっかりと管理された内部ネットワーク。 Apache httpdは、IdentityCheck
がOn
に設定されていない限り、この情報を決定しようとすることさえありません。 frank
(%u
)これは、HTTP認証によって決定されるドキュメントを要求するユーザーのユーザーidです。, 通常、CGIスクリプトには同じ値がREMOTE_USER
環境変数で提供されます。 要求のステータスコード(下記参照)が401の場合、ユーザーはまだ認証されていないため、この値は信頼されるべきではありません。 ドキュメントがパスワードで保護されていない場合、この部分は前のものと同様に”-
“になります。 (
%t
)リクエストが受信された時刻。, ここで、format
は、c標準ライブラリのstrftime(3)
のように、またはサポートされている特別なトークンのいずれかです。
ログ書式文字列で%{format}t
を指定することにより、時刻を別の形式で表示することができます。
は、C標準ライブラリのstrftime(3)
のようになります。 詳細については、mod_log_config
書式文字列を参照してください。
"GET /apache_pb.gif HTTP/1.0"
(\"%r\"
)クライアントからのリクエスト行は二重引用符で囲まれています。 リクエスト行には、多くの有用な情報が含まれています。, まず、クライアントが使用するメソッドはGET
です。 第二に、クライアントはリソース/apache_pb.gif
を要求し、第三に、クライアントはプロトコルHTTP/1.0
を使用しました。 また、リクエスト行の一つ以上の部分を個別にログに記録することもできます。 たとえば、フォーマット文字列”%m %U%q %H
“は、メソッド、パス、クエリ文字列、およびプロトコルをログに記録し、”%r
“とまったく同じ 200
(%>s
)これは、サーバーがクライアントに送信するステータスコードです。, この情報は、要求が成功した応答(2から始まるコード)、リダイレクト(3から始まるコード)、クライアントによるエラー(4から始まるコード)、またはサーバーのエラー(5から始まるコード)になったかどうかを明らかにするため、非常に価値があります。 可能な状態コードの完全なリストはHTTP仕様(RFC2616section10)で見つけることができます。 2326
(%b
)最後の部分は、応答ヘッダーを含まず、クライアントに返されるオブジェクトのサイズを示します。, クライアントにコンテンツが返されなかった場合、この値は”-
“になります。 コンテンツなしで”0
“をログに記録するには、代わりに%B
を使用します。
結合されたログ形式
別の一般的に使用される書式文字列は、結合されたログ形式と呼ばれます。 以下のように使用することができる。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combinedCustomLog log/access_log combined
この形式は、一般的なログ形式とまったく同じで、さらに二つのフィールドが追加されます。 追加の各フィールドは、パーセント指令%{header}i
を使用します。headerは任意のHTTP要求ヘッダーにすることができます。, この形式のアクセスログは次のようになります。
追加のフィールドは次のとおりです。
"http://www.example.com/start.html"
(\"%{Referer}i\"
)”Referer”(sic)HTTP要求ヘッダー。 これは、クライアントが参照されたと報告するサイトを提供します。 (これは、/apache_pb.gif
にリンクまたは含まれているページである必要があります)。 "Mozilla/4.08 (Win98; I ;Nav)"
(\"%{User-agent}i\"
)ユーザーエージェントHTTP要求ヘッダー。 これは、クライアントブラウザが自身について報告する識別情報です。,
複数のアクセスログ
設定ファイルに複数のCustomLog
ディレクティブを指定するだけで、複数のアクセスログを作成できます。 例えば、以下のディレクティブをつくることだけを目的としアクセスログダウンロード 第一には基本的なCLF情報が含まれ、第二と第三にはrefererとブラウザ情報が含まれています。 最後の二つのCustomLog
行は、ReferLog
およびAgentLog
ディレクティブの効果を模倣する方法を示しています。,
この例では、LogFormat
ディレクティブでニックネームを定義する必要がないことも示しています。 代わりに、ログ形式をCustomLog
ディレクティブで直接指定することができます。
条件付きログ
クライアントリクエストの特性に基づいて、アクセスログから特定のエントリを除外すると便利な場合があります。 これは環境変数の助けを借りて簡単に達成できます。 まず、リクエストが特定の条件を満たしていることを示す環境変数を設定する必要があります。, これは通常、SetEnvIf
で実現されます。 次に、env=
CustomLog
ディレクティブのCustomLog
節を使用して、環境変数が設定されている要求を含めるか除外します。 いくつかの例:
別の例として、英語話者からの要求をあるログファイルに記録し、英語話者以外の要求を別のログファイルに記録することを考えます。
SetEnvIf Accept-Language "en" englishCustomLog logs/english_log common env=englishCustomLog logs/non_english_log common env=!english
キャッシュシナリオでは、キャッシュの効率について知りたいと思うでしょう。, これを見つけるための非常に簡単な方法は次のとおりです。
SetEnv CACHE_MISS 1LogFormat "%h %l %u %t "%r " %>s %b %{CACHE_MISS}e" common-cacheCustomLog logs/access_log common-cache
mod_cache
mod_env
の前に実行され、成功すると、それなしでコンテンツを配信します。 その場合、キャッシュヒットは-
をログに記録し、キャッシュミスは1
をログに記録します。,
env=
構文に加えて、LogFormat
HTTP応答コードに条件付きの値のロギングをサポートしています。
LogFormat "%400,501{User-agent}i" browserlogLogFormat "%!200,304,302{Referer}i" refererlog
最初の例では、User-agent
HTTPステータスコードが400または501 それ以外の場合は、代わりにリテラル”-“がログに記録されます。 同様に、第二の例では、HTTPステータスコードが200、204、または302でない場合、Referer
がログに記録されます。 (注”!”ステータスコードの前に。,
条件付きロギングは非常に強力で柔軟性があることを示しましたが、ログの内容を制御する唯一の方法ではありません。 ログファイル用の場合完全な記録サーバーです。 多くの場合、単純にログファイルを後処理して、考慮したくない要求を削除する方が簡単です。