Apacheの導入

アクセスログの有効活用法

アクセスログの有効活用法

ユーザ情報を記録する!

ユーザ情報をアクセスログとは別のファイルに保存するテクニックを紹介します。

アクセスログをカスタマイズする!

アクセスログのデフォルトでは、リモート・ホスト名、リモート・ユーザ名、ユーザ認証によるリモート・ユーザ名、アクセス日時、HTTPリクエストヘッダー、ステータスコード、転送バイト数が記録されるようになっています。いま挙げた情報には、どこのリンクからページが表示されたのかのリファラー情報、ユーザのブラウザ情報などが欠けています。これらを記録するには、ほんの少しの修正で実現できます。

デフォルトの httpd.conf は下記のようになっている。

LogFormat "%h %l %u %t \"%r\" %>s %b
\"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
...
CustomLog /var/log/httpd/access_log common

上記では、LogFormat という命令文でログの出力フォーマットを設定しています。LogFormat命令文の末尾に combined、commonといった記述があります。これが出力フォーマットの名前です。そして、この出力フォーマットの名前を指定しているのがCustomLog とです。デフォルトでは、commonという名前の出力フォーマットを指定していますが、これを combinedという出力フォーマットに変えるだけです。

下記のように書き換えます。

CustomLog /var/log/httpd/access_log
combined
# CustomLog /var/log/httpd/access_log common

LogFormat

ここからは、先ほど紹介した LogFormatについてです。デフォルトでいくつかの出力フォーマットが用意されていますが、LogFormatを追加すれば、自分の好きなように出力フォーマットを設定することができます。

ログファイルの出力形式は、LogFormatでカスタマイズすることができます。ログフォーマットは各々のリクエストを1行で格納します。1行は幾つかのスペースによって区切られた項目によって構成されます。

# デフォルトの設定
LogFormat "%h %l %u %t \"%r\" %s %b"

ログ自体にダブル・クォーテーションをつけたい場合には、バックスラッシュ(\)によってエスケープします。ただし、文字列 %r, %...i,%...o;にはエスケープが効きません。

LogFormat変数

変数 解説
%h リモート・ホスト名
%I identによるリモート・ユーザ名
%u ユーザ認証によるリモート・ユーザ名
%t アクセス日時
%r HTTPリクエストヘッダー
%s ステータスコード
%b 転送バイト数
%f ファイル名
&U リクエストされたURL
%v サーバ名(バーチャルホストなど)
%{STRING}i リクエスト内のSTRING内容
%{STRING}o レスポンス内のSTRING内容

上記の表で、%{} で示される変数は、HTTPヘッダー内の任意の内容を参照します。たとえば、%{User-Agent}i はリクエスト・ヘッダー内の User-Agent フィールドの内容を示します。

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

上記では、ロギング情報は下記のように記述されます。

210.162.198.46 - [23/Mar/1998:01:09:05
+0900] "GET /game/images/recv_click.gif HTTP/1.1" 404
"Mozilla/4.0 (compatible; MSIE
4.01; Windows 95)" "http://www.rfs.jp/game/fr_main.html"

上記の例では、通常のログファイルから ident によるリモート・ユーザ名と転送バイト数を省き、かわりにアクセスを要求してきたブラウザの種類と、アクセスする直前に参照していたドキュメント、もしくはリンク先アドレスを追加しています。Refererは自サイトからのアクセスも他サイトからのアクセスも同じようにログに記録すしますが、RefererIgnoreで自サイトのアクセスを記録しないようにすれば、他サイトからのアクセスだけを記録することができます。

ある特定のステータスが発生したときに限り、%{} で参照される変数をロギングする場合は、 % と {}の間にコンマで区切ったステータス番号のリストを記述します。

LogFormat "%h %u %t \"%r\" %s \"
\"%401,403{Referer}i\""

あるアクセスが401または403のステータスを発生させた場合に限り、 Referere
で参照される直前のURLがログに記録されます。

エージェント・ログ

Apacheには、リクエスト元のブラウザ情報をログに書き出す機能があります。書き出されたログから、利用されているブラウザの傾向を知ることができます。
エージェント・ログ機能を有効にするには、AgentLog オプションを設定しましょう。

AgentLogの設定例は下記の通りです。

AgentLog  logs/agent_log

Apacheのサーバルートが /usr/local/apache の場合は、/usr/local/apache/ に agent_log が作成されます。

エージェントログの出力例

# InternetExplorer4.01
Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)

# NetscapeNavigator 4.04
Mozilla/4.04 [ja] (WinNT; I)

Refererログ

Apacheには、インターネット上のどのサイトのリンクをたどって自サイトへアクセスしてきたか(リンキング)をログに出力させる機能があります。
この機能を有効にするには、RefererLog オプションを設定します。

RefererLog logs/referer_log

RefererIgnore

アクセス・ログファイルには、デフォルトで他サイトからのリンキングと、自サイト内でのリンキングが記録されますが、特に他サイトからのリンキングだけを収集させることもできます。この場合、次のような設定を追加します。

RefererIgnore   www.rfs.jp

これでwww.rfs.jp内でのアクセス状況は無視され、他サイトからのリンキングだけが記録されるようになります。

ログファイルを定期的に切り出す!

ログファイルはアクセスのたびに大きくなるので、一定期間毎にログを別々のファイルに記録させたい場合もあります。とっても便利で素晴らしい機能ですが、この機能を使うにはApacheのソースを書き換える必要があります。

LogFileRotation

httpd.conf 内の TransferLog で定義したアクセス・ログファイルは、Apache サーバが稼動しつづける限り、すべてのログが指定された1つのファイルに記録されます。
一定期間ごとのログを別々のファイルに記録させることができれば、必要なログを検索しやすりますし、管理も容易です。

Apacheには、rotatelogsという簡単なログ分別ユーティリティが用意されています。指定した時間(秒)ごとに、そのログが作成された時間を示す数値を拡張子にしたログ・ファイルを作成することができます。
この機能を有効にするには、TransferLog オプションを設定しましょう。

TransferLog " |
/usr/local/apache/src/support/rotatelogs
             /usr/local/apache/logs/access 86400"

この例では、86400秒(24時間)ごとに /usr/local/apache/logs ディレクトリにaccess.0880851360 というファイルが作成されます。
拡張子をわかりやすく変更したい場合は、プログラムのソースに若干の変更を加える必要があります。

/usr/local/apache/src/support ディレクトリにある rotatelogs.c ファイルの70行目から73行目を下記のように変更します。

# 元のソース・コードを「/*」と「*/」で囲んで、
# コメントアウトします。
/*
time_t tLogStart = (time(NULL) / tRotation) * tRotation;
sprintf(buf2, "%s.%010d", szLogRoot, (int) tLogStart);
*/
# 次の3行を加えます。
time_t tclock = time(NULL);
struct tm *st = localtime(&tclock);
sprintf(buf2, "%s.%.2d%.2d%.2d%",szLogRoot,st->tm_year,
    st->tm_mon+1,st->tm_mday);
# 元のソース・コードを「/*」と「*/」で囲んで、
# コメントアウトします。
/*
tLogEnd = tLogStart + tRotation;
*/
# 次の1行を加えます。
tLogEnd = tclock + tRotation;

編集が終わったら変更を保存し、rotatelogs.c ファイルのあるディレクトリで次のようにコンパイルします。

# cc -o rotatelogs rotatelogs.c

これで同じディレクトリに新しい rotatelogsが作成されるので、Apacheを再起動しましょう。再起動後は、/usr/local/apache/logs ディレクトリに、 access.980317 というファイルが作成されます。拡張子の数字を翻訳すると、「98年3月17日」という意味になります。

実はもっと簡単な方法もあります。それは次のページで説明しています。

関連記事