visitors でリモートホストの集計

高速・軽量なアクセス解析ツール visitors およびその日本語化バージョン。素晴らしいツールなのだが、デフォルトではアクセス元ドメインの集計が全て「numeric IP」になってしまうのが難点だった。

そこで日本語化バージョンを元に、まずはIPアドレスごとに集計を行うよう修正した(パッチダウンロード)。

diff -ur visitors_0.7.orig/visitors.c visitors_0.7/visitors.c
--- visitors_0.7.orig/visitors.c	2007-08-20 19:11:54.000000000 +0900
+++ visitors_0.7/visitors.c	2009-03-28 17:38:59.000000000 +0900
@@ -1607,13 +1607,9 @@
 	char *tld;
 	int res;
 
-	if (vi_is_numeric_address(hostname)) {
-		tld = "numeric IP";
-	} else {
-		tld = strrchr(hostname, '.');
-		if (!tld) return 0;
-		tld++;
-	}
+	tld = hostname;
+	if (!tld) return 0;
+
 	res = vi_counter_incr(&vih->tld, tld);
 	if (res == 0) return 1;
 	return 0;

あとは出力時に逆引きを行えば良い。本当は visitors.c 内で行うように修正すべきなんだろうが、よく分からないのでPerlのワンライナーで変換することにした(下例ではIPアドレスっぽいテキストを全て変換してしまうので、もう少し真面目に書いた方が良いとは思うが……)。

visitors -A -m 45 -o html access_log | perl -pe \
's%(\d{1,3}\.){3}\d{1,3}%gethostbyaddr(pack("C4", split(/\./, $&)), 2) || $&%e' \
> out.html

元々 visitors のこの機能は、トップレベルドメインを集計して国別のアクセス傾向を知るためのものなので、リモートホストの集計に用いるのは邪道かも知れない。しかし実用上はこの方が役に立つ機会は多いと思う。

この改造にあたっては以下のページを参考にした:

こちらではまずアクセスログに記録されたIPアドレスを全て逆引きする方法を紹介されているが、ログが何十万行もある場合は逆引きに時間がかかり過ぎる……。この用途に限って言えば、IPアドレスで集計して上位のアドレスだけ逆引きするという方針で十分だろう。

2 Responses

  1. Kawamata より:

    こんにちは。私も、ホスト毎の集計の方が、都合が良いので、実にありがたい情報でした。

    patchを当てる…という作業をしたのは実に久しぶりで、WEBページのコードを拝借
    してファイルに保存して patch.exe <patch.diff のようにしたのですが、

    Hunk #1 FAILED at 1607.
    1 out of 1 hunk FAILED — saving rejects to file visitors.c.rej

    というエラーが出てうまく当てることができず、手入力しました。

    手入力前後でdiffをとってみたところ、TABとスペースの違いにより、エラーが
    出てたようです。(ソースコードではTAB、WEBページではスペース)

  2. tkyk より:

    お役に立てて良かったです。

    patchのTAB/スペースは、ターミナルからコピペしてブログに投稿するまでの、どこかの過程で変換されてしまったようです…。本文修正&念のためダウンロード版も置くことにしました。ご面倒をおかけしました。

Leave a Reply