Apache/ログ管理 のバックアップ(No.4) |
|
最近のApacheは、ソースに手を加えなくても、httpd.confだけでかなりカスタマイズできるようになってますね。- 2003.12.14
Linuxであれば、logrotateを使うのが普通なんでしょう。Windowsでもバッチファイルをタスクに登録すると同じことができます。
しかし、ここではApache付属の rotatelogs.exe を使ってみることにします。logrotateとの最大の違いは、古くなったログを消さないということです。
httpd.conf で
CustomLog logs/access.log common
と記述されているところを
CustomLog "| C:/Apache1.3.29/bin/rotatelogs.exe C:/Apache1.3.29/logs/access_%Y%m%d.log 86400" common
と変更します。ファイルパスは絶対パスじゃないとうまくいかないようです。86400は24時間になりますね。
refer.log, agent.log に対しても、同様にローテーション処理をした方がいいでしょうね。
「Webサイトの
AddModule mod_setenvif.c
が有効になっていることを確認して、(それ以降ならどこでもいいのですが)CustomLog周辺に
SetEnvIf Request_URI "\.(gif)|(jpg)|(png)$" nolog
を追加します。そして、
CustomLog logs/access.log common env=!nolog
とすると、指定した拡張子のファイルは記録されません。前述のローテーションと組み合わせて、
CustomLog "| C:/Apache1.3.29/bin/rotatelogs.exe C:/Apache1.3.29/logs/access_%Y%m%d.log 86400" common env=!nolog
って感じでしょうか?
cf . http://apache.cesars.org/docs-1.3/mod/mod_setenvif.html#setenvif
ついでに、Nimda等ワームからのリクエストは別ファイルに記録するようにしちゃいましょう。
SetEnvIf Request_URI "^/_mem_bin/" warm nolog SetEnvIf Request_URI "^/_vti_bin/" warm nolog SetEnvIf Request_URI "^/c/" warm nolog SetEnvIf Request_URI "^/d/" warm nolog SetEnvIf Request_URI "^/msadc/" warm nolog SetEnvIf Request_URI "^/MSADC/" warm nolog SetEnvIf Request_URI "^/scripts/" warm nolog SetEnvIf Request_URI "^/default.ida" warm nolog SetEnvIf Request_URI "^/NULL.IDA" warm nolog
CustomLog "| C:/Apache1.3.29/bin/rotatelogs.exe C:/Apache1.3.29/logs/warm_%Y%m%d.log 86400" common env=warm
を追加するとOK。
最近のApacheのアクセスログを見ると、以下のような「URI too long」なログが多く、ログファイルを無駄に肥大化させています。
{IP} - - [24/Apr/2004:11:57:21 +0900] "SEARCH /\x90\x02\xb1…(延々と続く)…\x90" 414 271 "-" "-"
「URI too long」なログはSetEnvIfではうまく分離できないので、LogFormatを変更して、「HTTP Statusが414でなければRequestを記録する」ようにしましょう。
LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
Referralログはどのページからリンクをたどってきたという情報です。
詳細なサイトトレースをしない限り、自サイト内の移動を記録することはないでしょう。
Apacheの以前のバージョンではmod_log_refererにReferralIgnoreってディレクティブがあったようですが、現在ではmod_log_configのSetEnvIfとCustomLogを組み合わせて実現できます。
例えば、当サイトの場合
SetEnvIf Referer jomora\.bne\.jp mysite
CustomLog logs/referer.log referer env=!mysite
とすると、Referがjomora.bne.jpだった場合、記録されません。前述のローテーションと組み合わせて、
CustomLog "| C:/Apache1.3.29/bin/rotatelogs.exe C:/Apache1.3.29/logs/referer_%Y%m%d.log 86400" referer env=!mysite
とします。
linuxではこっちの設定の方がいいでしょうね。
/etc/logrotate.d/apache
/var/log/apache/access_log { monthly copytruncate rotate 120 postrotate EXT=`date -d '1 day ago' +%Y%m` for f in $1; do mv $f.1 $f.$EXT; done # /bin/kill -HUP `cat /var/run/httpd.pid 2> /dev/null` 2> /dev/null endscript } /var/log/apache/error_log { monthly copytruncate rotate 24 postrotate EXT=`date -d '1 day ago' +%Y%m` for f in $1; do mv $f.1 $f.$EXT; done # /bin/kill -HUP `cat /var/run/httpd.pid 2> /dev/null` 2> /dev/null endscript }
ポイントは、
(参考サイト)