AWstatsで複数サーバのアクセスログをマージする

当サイトは(意味もなく)Webサーバを2重化して、lvsで負荷分散している。よってapacheのログもバラバラになっている。これではアクセス解析をするときにうまくないので、2台分のログをマージしてから解析してやろう。

おおまかな流れを説明すると、まず各Webサーバでログローテーションをするときにアクセスログを別ファイルに書き出す。このサーバ達にはAWstatsをインストールする必要はない。次に監視サーバで、定期的にrsyncを使って各サーバのアクセスログを取ってくる。そしてAWstatsに付属しているログファイルマージツールですべてのサーバのログをマージする。最後にAWstatsでマージ済みのログファイルを解析する。この方法だと解析をするのが週に一回になってしまうが、即時性は求めていないので構わないだろう。

まずはWebサーバの設定。各サーバの/etc/logrotate.d/httpdを以下のように修正する。追加したのはprelotateからendscriptまでの3行。

[root@www1 ~]# cat /etc/logrotate.d/httpd
/var/log/httpd/*log {
    prerotate
        cp -f /var/log/httpd/access_log /tmp/access_log
    endscript
    missingok
    notifempty
    sharedscripts
    postrotate
	/bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true
    endscript
}

次に、解析サーバの設定。以下のようなスクリプトを作って実行権限を付与する。中身は一目瞭然だとおもう。

[root@manager1 ~]# cat  /usr/local/bin/awstatsmerge
#!/bin/sh

rsync www1:/tmp/access_log /tmp/access_log1
rsync www2:/tmp/access_log /tmp/access_log2

logresolvemerge.pl /tmp/access_log1 /tmp/access_log2 > /tmp/access_log

/usr/bin/perl /var/www/awstats/awstats.pl -update -config=www.grandarbre.net > /dev/null

次に解析サーバのcronで、上記のスクリプトを定期的に回すように設定する。下記のようにすると毎週日曜日の5:00に起動するはず。

[root@manager1 ~]# cat /etc/cron.d/awstats 

0 5 * * 0 root /usr/local/bin/awstatsmerge

AWstatsの設定としては、参照するログファイルのパスを変えるだけ。

[root@manager1 ~]# cat /etc/awstats/awstats.www.grandarbre.net.conf 
...
LogFile="/tmp/access_log"
...