Webalizer で Apache のログ解析

Linux
この記事は約5分で読めます。
この記事は最終更新日より 1 年以上経過しています。
画像やリンクが無効になっている可能性もあるのでご了承下さい。

Apache のログは垂れ流したところで分かるのは見てるところだけ。
過去を辿って何千行ものログを見たくは無い。
良く CGI とかで使用されているアクセス解析を使う手もあるのだが、折角自由の効く
自宅サーバーなのだからこれはやるしかないというか、入れ忘れていたのでインスコ。
アクセス解析にも色々ソフトはある。
大御所の analog から今回いれた Webalizer や AWstats 。
最後に書いた AWstats は UI 等良くできているのだが、その分負荷が高い。
うちのサーバーではアクセスするだけで数秒待たされたりとかした経緯も過去にあり。
analog はテキストベースでシンプル過ぎる。
Webalizer なら GD ライブラリつかってグラフ化もしてくれたりするけど、出力は Static
となるので閲覧には負荷は無い。
そんなもんで今回はこいつをチョイス。
さて、アクセス解析をかけるターゲットは Apache のログだ。
ログの保存形式が簡単に logrotate で回していれば簡単な設定で済むのだが、
うちのサーバーでは日付毎に管理させている。
例えば今日のログなら "xxxx_access_log.20060627" ってな感じだ。
実際のログの吐き出し設定は以下の通り。

CustomLog "| /usr/local/apache2/bin/rotatelogs /usr/local/apache2/logs/www_access_log.%Y%m%d 86400 +540" combined

このままでは直にログファイル名を渡すことが出来ない。
解析対象が前日のログとなるから…。
そんなもんで簡単なシェルを書いてやる。
一時的に前日のログファイル名をソフトリンクを用いてユニークで固定な名前にする。
んでもって解析が終わったら削除するという手法をとってみた。
解析するドメインは引数として与えてやる。エラーチェックも忘れちゃいかん。
自分で使うだけなので汎用ではないが、参考になればこれ幸い。
webalizer.sh

#!/bin/sh
# Webalizer for an apache logfile of date format.
# To analyze log filename set.
# Argument is sub-domain name.
USER=$1
ORG_LOG=/var/log/httpd/${USER}_access_log.`date –date '1 day ago' +%Y%m%d`
NEW_LOG=/var/log/httpd/${USER}_access_log
# Exist check
if [ ! -d /home/${USER} ]; then
echo 'no such a domain.'
exit 1
fi
# make a temporary logfile
/bin/ln -s ${ORG_LOG} ${NEW_LOG}
# run webalizer
/usr/local/bin/webalizer -c /etc/webalizer_${USER}.conf ${NEW_LOG}
# unlink a temporary logfile
/bin/rm -f ${NEW_LOG}

流れとしては
前日のログファイル -> xxxxx_access_log と固定化 -> webalizer に解析させるという感じ。
無論、webalizer の設定ファイルは解析するドメイン毎に用意してやる。
今回は自分の管轄としている 3 つのドメインを解析とした。
メインとなる www ドメイン。ブログ用となる bucci ドメイン。ゲーム用の abyss ドメイン
の 3 つ。
それぞれの設定を "/etc/webalizer_{www,bucci,abyss}.conf" と 3 つに分け、各種設定を行う。
www ドメインだけはいろいろあるだけに設定は細かく変更済み。
他は汎用的にいけるよう、使う設定箇所だけにして設定内容を見やすくしてあげた。
ひとまず設定を終えて、テストで昨日分のログを出力させることに成功。
あとは過去 1 ヶ月分のログファイルを順次読み込ませて今月分全て解析させる。
それが終わったら root の crontab にぶち込んで終わり。
1 ヶ月分のログファイルを 1 こずつやっとったら手が疲れるので 1 行野郎で済ます。

# for i in `ls /var/log/httpd/www_access_log.200606* | grep -v "27$"`; do webalizer -c /etc/webalizer_www.conf $i; done

当日分までやってしまうと何かと面倒なので 27 日分は解析させない。
これで 30~120 秒待てば解析は完了。
ログファイル名と設定ファイル名を書き換えて 3 ドメイン分繰り返すだけで OK 。
最後に cron へ登録させるのだが、1 ドメイン 1 行なんてやっとれんし、メンテナンス
大変になるからさらにシェルを書く。
webalizer_all.sh

#!/bin/sh
# Analyze All Domains at Webalizer
#
domains='www bucci abyss'
for i in ${domains};
do
/path/to/webalizer.sh $i
done

これであとは解析対象が増えても domains 変数にドメイン名を追加して行ってやれば
らくちんになるのであります。
このシェルを毎日 00:05 に走らせるようにする。
# crontab -e
で以下のように追記編集して :wq して終わり。

5 0 * * * /root/bin/webalizer_all.sh > /dev/null

エラーは吐かせておかないとイクナイので "> /dev/null" とした。
完全に軌道に乗ってしまえば "> /dev/null 2>&1" なんてして全て捨てても良いかなと。
あとは cron でセットした時間にエラーメールがすっとんで来ないことを祈る(笑

著者プロフィール
ぶっち

本格的に PC へ触れ始めてたのは 1990 年位から。
興味は PC 全般。OS は Windows と Linux などを嗜む。
プログラマやネットワークエンジニアを経てフリーに活動している 40 代も後半に入ったおじさんです。

ぶっちをフォローする

コメント

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.