Visitorsのリアルタイム統計を過去ログも含めて出力する

自分のブログのアクセスを Visitors で解析することにしました。
Visitors – fast web log analyzer
日本語ページもあるけど、ちょっと古いね。でも、とりあえずの情報を得るには十分かな。
Visitors – fast web log analyzer

この Visitors というアクセス解析ソフト、特に新しいものではなく、2004年から存在しているらしいです。軽量でシンプルな解析結果を出してくれるのが好きで、前にもちらっと記事にしてました。
ログ解析ソフトと文字コードの狭間にて。 | 曖昧/旬
Webalizer の文字化けの話だった。Visitors は文字化けないね。でも、EUC-JP とか SJIS が入ってきても大丈夫なのかは試してないです。

そんな Visitors、起動の仕方は二種類あって、バッチ的に一発叩く方式と、リアルタイムに更新させるストリームモードという方式があります。バッチ方式は読み込むログファイルを指定して実行するだけ。ストリームモードは標準入力から入ってきたものを順次解析して出力してくれます。

どちらの方式がいいかって言うとケースバイケースですね。コンソールでつないでいる時にちょっと見たいだけならバッチ方式でテキスト形式のレポートを出すといいです。ブラウザで昨日までの結果を確認したいとかだとバッチ方式でHTML形式のレポートを日次で出せばいいと思います。今回は Visitors の特徴であるストリームモードでリアルタイムの統計情報を数分おきに出力させる設定をしてみました。

ストリームモードにする時の問題点は、Visitors 自身が過去のデータを保存してくれないことです。すなわち、Visitors を再起動するとゼロからやり直しなのです。過去のログを読み込ませた上で最新のログファイルを tail で監視する、みたいなことはできないのです。これは困りました。

そこはあきらめて今日の結果だけ出せばいいって人は、crontab から日次で visitors を再起動するか、Apache の httpd.conf のログ出力先にコマンドを指定するとかすればいいと思います。httpd.conf に書くならこんな感じですね。

CustomLog "|/path/to/visitors -A --output-file /path/to/report.html" combined

当たり前ですが、Apache が再起動するたびに統計はリセットされます。CustomLog 設定は複数指定できるので試してみるといいですよ。

crontab にしろ、Apache からの直接起動にしろ、再起動で統計がリセットされてしまう問題は付きまといます。それではちょっとイヤなんです。過去の結果も見たい。全部見たい。というわけで、名前付きパイプで解決することにしました。

ヒントになったのはこれ。

コマンドラインで1つ以上のログファイルを与えることも出来ますし、さらにそれらは日付順に並べなくてもいいし、同じ形式である必要もありません!

引用元: Visitors – fast web log analyzer
並べなおす必要がない。そう、ログを書き込む場所さえ確定していれば、書き込む順番は時系列でなくてもいいのです。ってなると、これですよ、FIFO。

プロセスがそのファイルシステム上の名前を使用してそのパイプに アクセスできるように参照ポイントを提供しているに過ぎない。

引用元: Man page of FIFO
これを使えば visitors 側は読み込みで開いておき、書き込みは適宜書き込んいくことができるようになります。

とりあえずFIFOを作る。

$ mkfifo -m 600 /path/to/fifo

念のためパーミションは変な人が書き込めないように設定。そして Apache はそこへ書き込むように設定。

CustomLog /path/to/fifo combined

読み込まないと Apache 側がブロックされてしまう可能性もあるけど、Apache はしっかりしているから上手いことやってくれるでしょう。ここまできたら visitors を起動。どんな方法でもいいので勝手に落ちないようにしておく。自分は crontab から起動。

0 3 * * * lsof /path/to/fifo | grep -q ^visitors || visitors --stream -A --output-file /path/to/report.html < /path/to/fifo &

毎日3:00にFIFOを開いているプロセスで visitors ってのがなければ visitors コマンドを実行。突然死は考慮していないのであしからず。毎分更新して欲しい場合は --update-every 60 を指定するといい。それと自分のサイトは WordPress なので --exclude /shun/wp- を指定して雑多な管理系ファイルなどへのアクセスを除外しています。

これだけだと起動後のログファイルしか解析しません。先に書いていたように過去のログも解析させたい。その場合はFIFOへ普通に書き込めばいいのです。

$ cat /path/to/access_log.old > /path/to/fifo

権限さえあれば普通に書き込みできます。圧縮された古いログファイルなんかも zcat とかで。

あとは突然死や再起動に備える必要がありますが、それは各自でどうぞ。再起動時に過去のログファイルも読み込ませる処理を入れておくといいかもしれないですね。自分はとりあえず手作業で対応するつもりです。

そんな感じで出しているのがこちら。
Visitors
シンプルな内容が好き。でも、ちょっとシンプルすぎる気もするので、なんかできないか考え中。CSSで調整できたらいいんだけど、ポータブル性を重視しているため、そういうのは難しそう。

という感じなんだけど、アクセス解析なら GoogleAnalytics とか使えばいいじゃん、て言われそうですが、自分はこういうシンプルなレポートの方が好きです。あと JavaScript からのリクエストよりも生ログを重視したいと思っています。