Last-modified: 2005-04-04 (月) 16:38:33 (6954d)

 最近のApacheは、ソースに手を加えなくても、httpd.confだけでかなりカスタマイズできるようになってますね。- 2003.12.14

 

rotatelogs.exeによるログのローテーション

 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サイトの見られ方(・・・・)をログからトレースする」という目的からすると、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

ウィルス、ワームからのリクエスト対策

 ついでに、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)

 最近の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ログから削除

 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によるログのローテーション

 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日前)を取得している。また、その処理を行っているために、世代管理でファイルが消されないようになる。

参考サイト

NCSA common形式から、combined形式へ変換するPerlスクリプト

  • 要は、common形式のログに「 "-" "-"」を付け足すだけです。
  • 引数にcommon形式(もしくは形式混在)のログファイル名を指定。
  • 既存の別フォルダ(ソース内で固定指定)に、combined形式のログファイルが同名で作成されます。
  • 解析できなかったログレコードは、標準出力に出力されます。(クォート系の不整合であることが多い)

添付ファイル: filecommon2combined.pl 7494件 [詳細]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS