最近のApacheは、ソースに手を加えなくても、httpd.confだけでかなりカスタマイズできるようになってますね。- 2003.12.14
#contents
#br
** rotatelogs.exeによるログのローテーション [#zc4ccfb3]
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 に対しても、同様にローテーション処理をした方がいいでしょうね。
** 画像ファイルをロギングしない。 [#y8deee65]
「Webサイトの&ruby(・・・・){見られ方};をログからトレースする」という目的からすると、access.logには画像ファイルへのリクエストは記録される必要はありませんね。
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
** ウィルス、ワームからのリクエスト対策 [#m3f1733d]
ついでに、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。
** ウィルス、ワームからのリクエスト対策(2) [#p4ea833d]
最近の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ログから削除 [#laf70e2d]
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
とします。
** logrotateによるログのローテーション [#nec4a8c9]
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
}
ポイントは、
-HUPシグナルを送ってログファイルを切り替えるんじゃなくて、copytruncate(ファイルの中身をコピーして削除)している。
-年月をファイル名に残すために、先月(ローテート処理した1日前)を取得している。また、その処理を行っているために、世代管理でファイルが消されないようになる。
([[参考サイト:http://www.asahi-net.or.jp/~aa4t-nngk/logrotate.html]])
** NCSA common形式から、combined形式へ変換するPerlスクリプト [#vccf1280]
#ref(common2combined.pl);
-要は、common形式のログに「 "-" "-"」を付け足すだけです。
-引数にcommon形式(もしくは形式混在)のログファイル名を指定。
-既存の別フォルダ(ソース内で固定指定)に同名ファイルが作成されます。
-既存の別フォルダ(ソース内で固定指定)に、combined形式のログファイルが同名で作成されます。
-解析できなかったログレコードは、標準出力に出力されます。(クォート系の不整合であることが多い)