ログファイル

アクセスログ

サーバアクセスログは、サーバによって処理されたすべてのリクエストを記録します。 アクセスログの場所と内容は、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アドレスです。 HostnameLookupsOnに設定されている場合、サーバーはホスト名を特定し、IPアドレスの代わりにログインしようとします。 ただし、サーバーが大幅に遅くなる可能性があるため、この構成は推奨されません。, 代わりに、logresolveのようなログポストプロセッサを使用してホスト名を決定することをお勧めします。 ここで報告されるIPアドレスは、必ずしもユーザが座っているマシンのアドレスではありません。 ユーザーとサーバーの間にプロキシサーバーが存在する場合、このアドレスは元のマシンではなくプロキシのアドレスになります。 -(%l)出力の”ハイフン”は、要求された情報が利用できないことを示します。, この場合、利用できない情報は、クライアントマシン上のidentdによって決定されるクライアントのRFC1413idです。 これらの情報は信頼できないときないケースがほとんど使用する以外にしっかりと管理された内部ネットワーク。 Apache httpdは、IdentityCheckOnに設定されていない限り、この情報を決定しようとすることさえありません。 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_cachemod_envの前に実行され、成功すると、それなしでコンテンツを配信します。 その場合、キャッシュヒットは-をログに記録し、キャッシュミスは1をログに記録します。,

env=構文に加えて、LogFormatHTTP応答コードに条件付きの値のロギングをサポートしています。

LogFormat "%400,501{User-agent}i" browserlogLogFormat "%!200,304,302{Referer}i" refererlog

最初の例では、User-agentHTTPステータスコードが400または501 それ以外の場合は、代わりにリテラル”-“がログに記録されます。 同様に、第二の例では、HTTPステータスコードが200、204、または302でない場合、Refererがログに記録されます。 (注”!”ステータスコードの前に。,

条件付きロギングは非常に強力で柔軟性があることを示しましたが、ログの内容を制御する唯一の方法ではありません。 ログファイル用の場合完全な記録サーバーです。 多くの場合、単純にログファイルを後処理して、考慮したくない要求を削除する方が簡単です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です