xserver
Home クッキー及びWeb ビーコンについて



Apache のログをカスタマイズ

Apacheログの概要

 ここでは、Apacheのログをカスタマイズする方法について具体的な例をだしていきながら説明していきます。Apache に限った事ではないのですが、ログは活用して初めて意味をなすもので、見もしない不必要なログを記録してディスクスペースを圧迫していたのでは元も子もありません。サイトにとって必要なログか不必要なログかを適切に判断し、有効に活用するようにしてください。また、Apache のアクセスログはそのまま放置しておくと、一ヶ月もすればすぐにギガ単位にまで達してしまいます(もっとも、アクセス数にもよりますが、なにもカスタマイズしていない状態で筆者の場合はそのぐらい)。そうならないためにも、ログのローテーションをする事が重要ですし、不必要な情報はカットすることもとても大切な事なので、当ページを参考にして是非、実践しておきましょう。




■Apache でのログの概要

 まず、Apache のログ指定では、以下のように4つのログフォーマットが用意されており、デフォルトでは、2行目のcommon が指定されています。

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

 上記の4つのLogFormat のうち、どのログ形式を使用するかを指定するディレクティブが以下のCustomLog フォーマットです。もう予測はついたと思いますが、要するに自分の環境に合ったLogFormat を作成し、それをCustomLogで指定すればいいわけです。

CustomLog logs/access_log common

 そこでまず覚えておきたいのが、Apache のログフォーマットの変数です。%h だの%l だの書かれていても何のことだかさっぱりわからないと思うので、以下表を参考にしログのフォーマットをカスタマイズしていきます(他にももっとたくさんあります)。詳細について詳しく知りたい方は以下URLを参照してください。

http://httpd.apache.org/docs-2.0/ja/mod/mod_log_config.html



◎LogFormatの変数
 %a リモートIPアドレス
 %A ローカルIPアドレス
 %B HTTPヘッダを除いた転送バイト数
 %b HTTPヘッダを除いた転送バイト数。転送バイト数が0の場合は - が記述されます。
 %h リクエストしたリモートホスト名
 %H リクエストされたプロトコル
 %l identによるリモート・ユーザ名
 %t リクエストを受けた時刻
 %r HTTPリクエストヘッダー
 %s サーバーがリクエストに対して返したステータスコード。%>s と記述することで最後のリクエストを記します。
 %U リクエストされたURL
 %u 認証に使用されたリモートユーザー名
 %v リクエストを処理するサーバー名
 %V UseCanonicalNameディレクティブの設定に応じたサーバー名

 その他にも、どのURLから来たかを取得するリファラーを指定する場合には、%{Referer}i をつけます。%{User-Agent}i はクライアントのブラウザやOS の情報を取得することができます。なお、デフォルトで用意されているcombined を使用すればユーザーエージェントとリファラーがログに記録されます。

CustomLog logs/access_log combined



■画像情報を取得しない

 Apache のログはデフォルトでは、リクエストされた画像情報までログに残します。しかし、これらの情報はあまり必要ないし、仮に1ページに10個の画像が配置されていたら、10行の画像情報のログを吐くことになるため、ログが無駄に肥大化します。また、ログを閲覧する際にも非常に見にくくなりますので画像に関してはログには出力しないように設定しておきます。ここでは、Apache のモジュールのひとつである、SetEnvIf を使用します。SetEnvIf はApache のインストール時にデフォルトで組み込まれていますが、念のため以下コマンドで確認しておいてください。

# apachectl -l
mod_setenvif.c

◎画像の出力例
192.38.233.56 - - [19/Jan/2004:00:48:40 +0900] "GET /img/a.jpg HTTP/1.1" 404 294
192.38.233.56 - - [19/Jan/2004:00:48:54 +0900] "GET /img/b.jpg HTTP/1.1" 404 294
192.38.233.56 - - [19/Jan/2004:00:49:02 +0900] "GET /img/c.jpg HTTP/1.1" 404 294

 次に、httpd.conf を編集していきます。以下のようにSetEnvIf ディレクティブを追記し、CustomLog にenv=!nolog を追加しておきます。ドット「. 」の前にはエスケーブ文字「\」をつけるのも忘れないようにしましょう。筆者の場合は、.css と .js の情報もいらないのでついでに追加しておきます。

CustomLog logs/access_log combined env=!nolog

# SetEnvIf
SetEnvIf Request_URI "\.(gif)|(jpg)|(png)|(css)|(js)$" nolog

 最後にApache を再起動します。再起動したら、画像がたくさん置いてあるページにアクセスしてログを確認してみてください。かなりすっきりした表示になっていると思います。

# apachectl restart



■ワームのログを記録しない or 別出力する

 Apache には、Nimda やCodeRed などのワークのログも記録されます。access.log を開いてみると以下のようなログが出力されているのが見つかると思います。以下はCodeRed のログで、Apache を使っている方にとっては無視してもいいので(CodeRed やNimda はIISを対象としたワーム)、ログを記録しないか、あるいは別出力するように設定しておきます。

219.154.22.X - - [19/Jan/2004:10:50:21 +0900] "GET /default.ida?XXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7 801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00 =a HTTP/1.0" 404 209

 まず、以下のようなワームが残すログをaccess_log には記録しないように設定し、また、ワームのログだけを worm_log に別出力とすることにします。

SetEnvIf Request_URI "^/_mem_bin/" worm nolog
SetEnvIf Request_URI "^/_vti_bin/" worm nolog
SetEnvIf Request_URI "^/c/" worm nolog
SetEnvIf Request_URI "^/d/" worm nolog
SetEnvIf Request_URI "^/msadc/" worm nolog
SetEnvIf Request_URI "^/MSADC/" worm nolog
SetEnvIf Request_URI "^/scripts/" worm nolog
SetEnvIf Request_URI "^/default.ida" worm nolog

CustomLog logs/access_log combined env=!nolog # ワームログを切り落とす
CustomLog logs/worm_log combined env=worm   # ワームログを別出力


 最後に、worm_log をローテーションできるようにしておきます。/etc/logrotate.d/httpd に以下のようにワームのログローテート設定を追加しておきます。ログのローテーションに関しては、「logrotate によるログのローテーション」を参照してください。

# vi /etc/logrotate.d/httpd

/usr/local/apache2/logs/access_log /usr/local/apache2/logs/error_log
/usr/local/apache2/logs/worm_log {
      weekly
      rotate 4
      missingok
      sharedscripts
      postrotate
            /bin/killall -HUP `cat /usr/local/apache/logs/httpd.pid 2>/dev/null` 2> /dev/null
      endscript
}

 Remote_Host リモートホスト名
 Remote_Addr リモートアドレス
 Remote_User 認証されたユーザ名
 Request_Method 使用されているメソッド名
 Request_Protocol リクエストが行なわれたプロトコルの名前とバージョン(HTTP1.1など)
 Request_URI URL のスキームとホストの後の部分



■自ネットワークからのアクセスを別出力する

 ここまできたら、もう要領は同じですね。自分のネットワークからのアクセスを外部からのアクセスログとは別に出力します。また、上記で設定した画像情報も出力しないようにしておきます。ログのローテーションも上記の要領で行っておいてください。

SetEnvIf Remote_Addr ^172\.16\. localnet nolog
CustomLog logs/localnet_log common env=!nolog
CustomLog logs/localnet_log common env=localnet



■agent/referer ログを別出力

 httpd.conf を眺めていると以下のような行が見つかると思います。このディレクティブを有効にすると、エージェントログとリファラーログが別出力されるようになるので、アクセス層を調べたり、参照元を調べたりするにはちょうどいいかもしれません。興味のある方は、ディレクティブを有効にして、試してみてください。

CustomLog logs/referer_log referer
CustomLog logs/agent_log agent

◎agent ログの出力例
Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; Win 9x 4.90)
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/106.2 (KHTML, like Gecko) Safari/100.1



■エラーログのLogLevel

 Apache のエラーログを記録するerror.log のデフォルトのログレベルはwarn に設定されています。運用状態にあるサーバでは、warn もしくは、noticeでも構いませんが、テスト段階であれば、info や debug を使ったりもします。以下に、設定できるログレベルについて解説しておきます。でも、実際に試してみないとイメージが沸かないと思うので、自分で試してみることをお勧めします。

ErrorLog logs/error.log
LogLevel warn

◎LogLevel
 emerg 緊急に対処する必要があるメッセージを記録する
 alert 警告メッセージを記録する
 crit 致命的なメッセージを記録する
 error 存在しないファイルへのアクセスなどのエラーが記録される
 warn 警告メッセージ。設定ミスがある場合に、警告を発する。
 notice 通知メッセージを記録する
 info プロセスの起動や停止などの情報が記録される
 debug デバッグに必要となる情報を記録する







TOPに戻る

Sponcerd Link


Search
 
Web サイト内
Rental Server

【レンタルサーバのXbit】 低価格・高品質のビジネスクオリティー。300メガ1,050円~30分で サービススタート可能!


容量300MB、月額125円、高性能なサーバが日本最大級のバックボーンに直結。
さくらのレンタルサーバ




当サイトはLinux自宅サーバーの構築を目的としたサイトです。
当サイトに関するご意見、ご要望等は、こちらのメールアドレスよりお願いします。
Beginning | Introduction | Installation | Server |
Security | Tips | Related-Sites
Copyright©2003-2006 KORO All Rights Reserved.
総計:
今日:
昨日: