Index > awstats を使って特定のページだけのアクセスログ統計レポートを作成する
Wed, May 9, 2007

{update:2007-05-10}

awstats を使って特定のページだけのアクセスログ統計レポートを作成する

awstatsは、メジャーなアクセスログ統計レポート作成ツールです。 一般的な使い方としては、自動的にウェブサーバのログを拾ってきて 日々のレポートを自動生成するのに使うと思いますが、
特定のページだけのレポートを生成するためのツールとしても、 使えます。

基本的にはごく単純な作業なのですが、思わぬ落とし穴があったので、 忘れないようにメモしておきます。

awstatsを手動で使って特定ページの集計レポートをつくる

通常の場合(で手動で処理する場合)

awstatsは、 ウェブサーバのログが、 myaccess.log である場合、以下のように実行するだけです。

$ /perl ./awstats.pl -config=awstats.conf -update -LogFile=myaccess.log

そうすると、awstats.conf 内の DirData= に設定されているディレクトリに 統計データが生成されます。
あとは、以下のようにすればレポートが標準出力されます。

$ perl awstats.pl -config=awstats.conf -month=5 -year=2007 -output -staticlinks 

特定ページだけのレポートを作成する場合

特定ページだけのレポートを作成する場合は、何らかの方法で、アクセスログから、 不要なページのログを削除しておいたアクセスログデータを作成しておき、 先ほどの手順で処理すればよいことになります。

(必要に応じて、DirData= で指定している統計データ保存用ディレクトリ内のファイルを削除してから 実行しましょう。)

思わぬ落とし穴が...

ということで、 すごいシンプルなのですが、awstats は、統計データを作成するときに、 自分がどの時点までのログの統計データを処理したかを覚えていて、 間違えて古いアクセスログデータを awstats 与えても、無視するようになっています。

しかし、この親切機能が、手動でアクセスログデータを作成して、awstats に与える場合は、 注意すべき問題点となります。

たとえば、/about.html と /contact.html ページだけの統計を取りたい場合

元のアクセスログデータが myaccess.log だとすると、 以下のようにabout.htmlとcontact.htmlに関するログだけを抜き出し...

$ cat myaccess.log | grep "GET /about.html" > about_html.log
$ cat myaccess.log | grep "GET /contact.html" > contact_html.log

awstatsで統計を取ればいいように思うのですが、

$ /perl ./awstats.pl -config=awstats.conf -update -LogFile=about_html.log
$ /perl ./awstats.pl -config=awstats.conf -update -LogFile=contact_html.log

このように処理すると、最初の abouthtml.log は何の問題もないのですが、 contacthtml.log の方のいくつかのログデータは、古いレコードだと言われて (Found XXX old records,) 統計処理されません。

そこで、ひとつのファイルにまとめればいいというような単純な発想で、 以下のように処理してしまうと、

$ cat myaccess.log | grep "GET /about.html" > my.log
$ cat myaccess.log | grep "GET /contact.html" >> my.log
$ /perl ./awstats.pl -config=awstats.conf -update -LogFile=my.log

今度は、壊れているレコードがある(Found XXX corrupted records)と 言われてやはりうまくいきません。 (たぶん、処理対象のログファイル内のレコードが時系列に並んでいないのが原因で、 corrupted records といわれるのだと思われる。)

my.log の各行を時系列に並べ替えればいいのだが、 元のログから抽出してしまった後で、ソートするのは難しい。

そこで、 (わかってしまえば簡単な話なのだが、) 元のログは時系列に並んでいるのだから、 grepの -e オプションを使って or 検索を指定し、 元ログから一度の処理で対象となるレコードを抽出してやればよい。

$ cat myaccess.log | grep -e "GET /about.html" -e "GET /contact.html" > my.log
$ /perl ./awstats.pl -config=awstats.conf -update -LogFile=my.log

これで意図通り統計データを作成できる。

 Twitter
follow me on Twitter
 Categories