Apache で詳細なログを収集する

SERVER


Apache のサイトログ

Web サーバ Apache 2.0.48 を Linux 上で動作させていたのですけど、そういえばアクセスログがすごく少ない感じだったので、そのあたりを調整できないかどうか調べてみました。

するとどうやら "httpd.conf" の設定にて、TransferLog ディレクティブではなくて CustomLog ディレクティブを使用することで、詳細なログを収集することが出来るとのことでした。この CustomLog ディレクティブは、LogFormat ディレクティブを用いて記録したいログを設定することで TransferLog よりも詳細なログを記録することが出来ます。

 

TransferLog で収集しただけの場合は、次の情報が記録されます。

%h 接続してきたリモートホスト (クライアント) の IP アドレスです。
%l RFC 1413 認証で得られるユーザ名だそうです。
%u Apache の認証で得られるユーザ名です。
%t アクセスしてきた時刻です。
"%r" クライアントからの要求の最初の1行です。
%s サーバが返すステータス番号です。
%b ヘッダー除いた送信データのバイト数です。

今回はこれに、クライアントのブラウザ情報 (HTTP_USER_AGENT) と、リンク元を知るきっかけに繋がる HTTP_REFERER の情報と、それと Cookie 関連のログを残してみようと思います。

 

HTTP_REFERER と HTTP_USER_AGENT を記録する

これは基本的に TransferLog で取っていたログを CustomLog に変えてあげれば良いので簡単です。

CustomLog ディレクティブはあらかじめ LogFormat で決めた形式でログを収集できるもので、少なくとも自分が利用していた Apache の設定ファイルには最初から HTTP_REFERER および HTTP_USER_AGENT を合わせて記録する LogFormat が用意されていました。

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" "\%{User-Agent}i\"" combined

この LogFormat の行がそれで、"%{Referer}i" と "%{User-Agent}" として記されているところが、ちょうど HTTP_REFERER と HTTP_USER_AGENT が記録されるところになります。

最後についている "combined" というのは、この LogFormat に付けられた名前で、CustomLog ディレクティブを使用する際にこの名前を指定することで、この LogFormat が有効になります。

 

あとは CustomLog ディレクティブを "httpd.conf" のグローバルセクションや <VirtualHost> ディレクティブ内に記述してあげれば、HTTP_REFERER および HTTP_USER_AGENT も合わせてログに記録されるようになります。

CustomLog ディレクティブは、記録するログファイルのパスと LogFormat 名を指定する必要がありますので、記載する場合は次のような感じになります。

CustomLog /var/log/apache/access.log combined

これらの調整が終わったら Apache を再起動すれば、その時点から新しいログ形式で記録されるようになります。

 

Cookie 情報を記録する

Apache で Cookie 関連のログを取得するためには mod_usertrack というモジュールを組み込む必要があるとのことでした。

このモジュールはディフォルトでは組み込まれないとのことです。でも、あらかじめ機能の一部としては備わっているようなので、"httpd.conf" ファイルを少し調整することで、このモジュールを利用することが出来るよう…だったのですけど。

どうやら "mod_usertrack.so" というモジュールファイルが、そもそもそのままでは存在していないようでした。

 

調べる限りではなんだか素直に組み込めるような感じなのですけど、実際にやってみてもファイルがないということでエラーとなってしまいました。

どうしたものかといろいろ調べてみたところ…、そもそもこの mod_usertrack というモジュールは、訪問者の動きを追跡するための Cookie  (ユーザー・トラッキングクッキー) を自動的に発行させるためのもののようですね。

 

Cookie 情報をログに含めようと思っていた理由は、別件で、ログ解析で足りない情報があるから調整して欲しいとのお話しがあったからだったのでした。

その件であったら便利ということで紹介されていたのがこの mod_usertrack を用いて Cookie のログを収集するというお話しだったのですけど、あくまでも個人的に、そこまで自分が追跡するのはあまり良い感じがしないので、これは今回はやめておくことにします。

 

なお、トラッキングクッキーの機能を別とすれば、サーバとクライアント間でやり取りされた Cookie のログは、次のような感じの記載を LogFormat ディレクティブ内に含めることで記録可能となるようです。

%{cookie}i

%{Set-cookie}o

最初の方がクライアントから送信されてきた Cookie 情報で、次のがサーバから送信する Cookie 情報となります。

 

その他のログを記録する

他にも次のような項目を、LogFormat ディレクティブで指定することが出来るようです。

%b ヘッダー除いた送信データのバイト数です。
%{name}e name で指定された環境変数の値です。
%f 要求された URL に対応する実際のファイル名です。
%h 接続してきたリモートホスト (クライアント) の IP アドレスです。
%{header}i クライアントからの要求に含まれる、header で指定された名前の HTTP ヘッダー情報です。
%{header}o サーバーからの応答に含まれる、header で指定された名前の HTTP ヘッダー情報です。
%l RFC 1413 認証で得られるユーザ名だそうです。
%p サイトのポート番号です。
%P サービスプログラムのプロセス ID です。
%r クライアントからの要求の最初の1行です。
%s サーバが返すステータス番号です。
%t アクセスしてきた時刻です。
%{format}t アクセスしてきた時刻を、format で指定された書式で記録します。書式は C 言語の strftime にて使用する書式です。
%T 要求を処理するのにかかった時間です。
%u Apache の認証で得られるユーザ名です。
%U クライアントから要求された URL です。
%v 要求された URL で指定されたサーバー名です。

 

内容を条件付で記録する

各ログの項目は、Web サーバのステータスによって記録するかどうかを調整することが出来ます。

調整の仕方は簡単で、各項目の "%" 記号の次に、記録したいサーバーステータス番号を記載してあげる感じになります。たとえば URL が存在しない (404) のときのみ HTTP_REFERER の内容を記録したい場合には、%404{Referer}i となります。

他にも %200,303U というように二つのステータスを条件としたり、%!200{User-Agent} というように頭に "!" をつけることでそのステータス以外の場合としたりすることも出来るようになっています。

 

ただ、条件付とは言っても項目毎の条件であって、条件に見合わないステータスだった場合にはそこには "-" が記録されることになります。

全ての項目についてたとえば 200 の場合のみの記録としたとしても、それ以外の場合にもログが記録されないことはなくて "-" のみで構成されたものが残されます。