Webalizer の設定で指定できる増分設定を使い分けて,ディスクの有効利用と不要なリファラの削除の両立を狙う。
Webalizer は Web サーバへのアクセス統計を表示してくれるソフトウェア。月別の詳細な統計と,1年間のアクセス推移を見やすい形で表示してくれる。
動作設定は /etc/webalizer.conf で行う。Incremental ディレクティブを yes に設定しておくと,新しいアクセス分だけを追加していってくれるため,古いアクセスログを消してしまっても統計情報だけは残すことができる。しかし,逆に不要な統計情報が削除できないという欠点もある。例えば,新しい検索ロボットが来るようになったから統計には加えたくないとか,変なリファラを削除したいなどがある。これらの不要なアクセス情報は webalizer.conf の設定で排除することができるが,設定後のアクセスにしか有効にならない。詳細は nlog(n): 不要なリファラを無視したい に書いた通りで,結構悩ましい。
次にあげる若干矛盾する要件を満たすような方法を考えてみたい。
Webalizer の「Webalizer は最長1年前までの情報しか集計しない」を加味して考えて,次のように対処することにする。
前提条件としては,Apache のアクセスログを月毎に別ファイルとしてあることである。つまり,先月のログは access_log.200503,現在のログは access_log というファイル名で保存されていることが必要である(nlog(n): Apache のログを月別に保存したい)。
1時間毎の集計は,「Incremental yes」として access_log ファイル1つを対象に行えば短時間で処理が終わる。1日毎の処理については,新しく webalizer-daily.sh というシェルスクリプトを書いた(ファイル名は適当)。
Bourne Shell を使いたかったので,かなりの力技になっている。2005年4月現在では,2004年5月以降が集計対象になるので,対象となるログは access_log.200405, access_log.200406,..., access_log になる。また,ログが1年分ない場合にも対応している。例えば先月と今月だけの場合は,access_log.200503 と access_log の2つが集計対象になる。ファイル名の代わりに「-」を指定し,標準入力を対象の入力としている。起動オプション「-i」は,履歴を無視する指定である(Webalizer README)。ただし,このオプションを有効にするためには,webalizer.conf の中で「Incremental no」を指定しておかなければならない。これにより webalizer.conf の設定が過去の情報にも反映される。実行許可を与えて /etc/cron.daily に入れておけばよい。
ディスクが効率的に使えると言っても,1年間分はプレーンテキストのまま保存されるため,相当な量になる。より効率的に使うには,1か月前以前のログは gzip で圧縮してしまい,上記のスクリプトでは zcat を使うようにすればいいだろう。
1時間に1度更新するための cron 用スクリプトは,デフォルトで用意されている /etc/cron.hourly/00webalizer をそのまま使ってもいいし,上記のスクリプトと同じ様に次のように書いてもよい。「-p」オプションで「Incremental yes」を強制的に指定している。
2006年2月14日追記:
前月用のファイル名を取得するために次の書式を使っていましたが,
月末に思ったように動作しない場合があることが分かりました(nlog(n): date コマンドのバグ)。この問題はコメントをいただいて解決しました。
ダブルクォートが入り乱れていますが,動きます。「%Y-%m-01」の「01」の部分は,「01」以外に「15」などにしても同じように前月の取得ができます。「31」にすると,前月が30日しかない場合に今月になります。
スクリプトの書き換えを行いました。
Posted by n at 2005-04-19 23:40 | Edit | Comments (0) | Trackback(0)
Master Archive Index
Total Entry Count: 1957