Oct 062006
 

CentOS 3にはwebalizerが標準で含まれていて、インストールすると毎日自動でログ解析がおこなわれるようになってます(http://localhost/usage/でアクセス可能)。
しかしアクセスログをrotatelogsを使った日付つきファイル名に出力するようにしてしまうと、これが実行されなくなってしまいます。

単にwebalizerのcron処理が/var/log/httpd/access_logをファイル名固定で処理対象としているだけなので(/etc/webalizer.confで設定)、毎回前日分のaccess_logを入力するようにすれば解決できます。

CustomLog出力は、access_log.%Y-%m-%d形式で出力するよう、/etc/httpd/conf/httpd.confを変更したとします。

CustomLog "/usr/sbin/rotatelogs /var/log/httpd/access_log.%Y-%m-%d 86400" combined

/etc/cron.daily/00webalizerはログファイル名を引数で与えるように変更します。dateコマンドの–date yesterdayオプションを使って、昨日の日付を計算させています。

# cp -p /etc/cron.daily/00webalizer /etc/cron.daily/00webalizer.rpmorig
# vi /etc/cron.daily/00webalizer
# cat /etc/cron.daily/00webalizer
#!/bin/bash
# update access statistics for the web site

accesslog=/var/log/httpd/access_log.`date --date yesterday '+%Y-%m-%d'`

if [ -s ${accesslog} ] ; then
    /usr/bin/webalizer ${accesslog}
fi

exit 0

/etc/cron.*/配下のファイルは特定サフィックスだと実行対象から除外されますので(/usr/sbin/run-partsスクリプト参照)、.rpmorigというサフィックスでバックアップしてます。

■2006-12-20追記
これだけではwebalizer処理が実行される4:00から9:00頃までのログが抜け落ちることがわかりました。
前述のrotatelogs指定ではUTC(つまり日本時刻の9:00)にログが切り替わってしまうためです。
回避するためには日本時刻の0:00に切り替わるようにUTCオフセットを指定するなどの対応が必要になります。

CustomLog "/usr/sbin/rotatelogs /var/log/httpd/access_log.%Y-%m-%d 86400 540" combined

ログファイルをマスク指定で全件入力させちゃう方法もありますが…

cat /var/log/httpd/access_log.????-??-?? | /usr/bin/webalizer

ログファイル数次第では、とてつもない処理量になる可能性がありますので注意しましょう。

Sorry, the comment form is closed at this time.