WebalizerによるWebアクセスログ解析


Apacheのログ解析ができないか調べたところanalogというのがRedHatにあり、取り敢えず動かしてみましたが、WWWサーバテストのログまで解析されてしまい今一でした。そんな時、BBSでU-mexさんからWebalizerを紹介されたので入れてみました。デフォルトのままでは余計なものも表示されますので、少しチューニングが必要ですが、なかなか洗練されていると思います。サンプルがこちらにあります。

ログ量が多いと解析時間がずれログ解析中にlogrotateされるとおかしくなることがあるらしいので、タイミングでの処理をやめ、logrotate後にlogrotateしたファイルを解析するようにしました。(2003.09.23)
検索文字列が文字化けするので、対策しました。(2003.12.06)
ログ解析を Incremental モードで動作させていると、障害時にバックアップからログファイル等を戻したりすると、以後、解析が進まなくなることがあります。その場合の復旧方法を追記しました。(2004.01.29)

■ Webalizerのダウンロードとインストール

Webalizerをこちらからダウンロードします。

インストールは、任意の場所にソースを展開してコンパイルします。なお、Webalizerを動かすには、GDライブラリとlibpngが必要です。Redhat8の場合、パッケージ管理で、「Xの開発ツール」をインストールしておけば問題ありませんので、事前に確認しておきます。ここでは、グラフ表示を日本語表示(パッチをあてればグラフ内や表中も日本語できるようです、おやじはやっていません。)になるようconfigureオプションで指定します。また、おやじはApacheでログを採るときに既にホスト名でログを採取しているので必要ありませんが(指定するとエラーになる)、IPアドレスでログは採っているがWebalizerではホスト名で表示したい場合は、configureでdnsオプションを指定します。

$ tar zxfv webalizer-2.01-10-src.tgz
$ cd webaizer-2.01-10
$ ./configure --with-language=japanese --enable-dns
$ make
$ su
# make install

■ Webalizerの設定

Webalizerの設定は、インストール時に作成される/etc/webalizer.conf.sampleをベースに作成していきます。一般的には、このファイルを/etc/webalizer.confとしてコピーし設定していけばいいと思います。おやじの場合は、おやじと娘のサイトでログを分けていますので、それぞれについて/etc/webalizer_oyaji.confと/etc/webalizer_akirin.confを作成しました。

# cp /etc/webalizer.conf.sample /etc/webalizer_oyaji.conf
# cp /etc/webaiizer.conf.sample /ets/webalizer_akirin.conf

以下、各設定項目を設定していきますが、かなりの項目が設定可能であり、ここではおやじが変更した項目を中心に示します。下記は、おやじの設定(webalizer_oyaji.conf)を基本とし、娘の設定(webalizer_akirin.conf)は、( )で併記してあります。

■ Apacheの設定

Webalizerでリファラーを採りたい場合、Apacheのデフォルト設定ではログにリファラーが採られないため、httpd.confを変更する必要があります。
おやじのログ周りの設定を以下に示します。(先頭の数字は説明用です。) リファラーを採るには、8/10行目のようにデフォルトの「common」から「combined」に変更します。

  1. SetEnvIf Remote_Addr 192.168.1. homelog nolog
  2. SetEnvIf Request_URI "~akirin" akirinlog nolog
  3. SetEnvIf Request_URI "default.ida" wormlog nolog
  4. SetEnvIf Request_URI "root.exe" wormlog nolog
  5. SetEnvIf Request_URI "cmd.exe" wormlog nolog
  6. SetEnvIf Request_URI "Admin.dll" wormlog nolog
  7. CustomLog logs/home_log common env=homelog
  8. CustomLog logs/akirin_log combined env=akirinlog
  9. CustomLog logs/worm_log common env=wormlog
  10. CustomLog logs/access_log combined env=!nolog

■ Webalizerの起動

まずは、手動でWebalizerを動かして、解析結果を見てみましょう。
logrotateされた古いログ (accsess_log.1/2/3・・・)がある場合は、下記のように日付の古い順に処理します。

# /usr/local/bin/webalizer -c /etc/webalizer_oyaji.conf /usr/local/apache2/logs/access_log.3
# /usr/local/bin/webalizer -c /etc/webalizer_oyaji.conf /usr/local/apache2/logs/access_log.2
# /usr/local/bin/webalizer -c /etc/webalizer_oyaji.conf /usr/local/apache2/logs/access_log.1
# /usr/local/bin/webalizer -c /etc/webalizer_oyaji.conf /usr/local/apache2/logs/access_log
結果をブラウザで確認してみましょう。見せたくないものが見えてしまっている等、結果が思わしくない場合は、webalizer_oyaji.confファイルを変更し、HistoryName (webalizer_oyaji.hist)、IncrementalName (webalizer_oyaji.current)で指定したファイルを削除して初めからやり直せば大丈夫です。
問題がなければ、cronに登録して自動的に集計するようにします。おやじは、下記のような簡単なスクリプトを書き /usr/local/bin/webalizer.shとして保存し、0:01に起動するようにしています。

ログ量が多いと解析時間がずれログ解析中にlogrotateされるとおかしくなることがあるらしいので、タイミングでの処理をやめ、logrotate後にlogrotateしたファイルを解析するようにしました。また、検索文字列が文字化けするので、対策しました。rotateしたファイルを解析するようにWebalizer.confのLogfileの設定変更を忘れずに。
  1. Apacheのlogrotate設定ファイルの作成

     設定は、毎日更新(daily)、一か月分のログを残し(rotate 31)、rotate後に新規のログファイルを作成(create)するようにした。
    # vi /usr/local/apache2/logs/logrotate.conf

    # logrotate.conf
    daily
    rotate 31
    create
    /usr/local/apache2/logs/*_log {
        missingok
        sharedscripts
        postrotate
        /bin/kill -HUP `cat /usr/local/apache2/logs/httpd.pid 2>/dev/null` 2> /dev/null || true
        endscript
    }

    [Esc],[:],[w],[q]で保存

  2. 日本語コードの変換

     コード変換用のスクリプトを作成し、/usr/local/bin/jconvとして保存、実行権を付与する。

    # vi /usr/local/bin/jconv

    #!/usr/bin/perl
    use Jcode;
    while(<>){
       $_ =~ s/(%|\\x)([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($2))/eg;
       Jcode::convert(\$_,euc);
       print;
    }

    [Esc],[:],[w],[q]で保存

    # chmod 755 /usr/local/bin/jconv

     なお、このスクリプトでは Jcodeを使用するので、インストールしてなければ、下記でCPANからインストールする。

    # perl -MCPAN -e shell
    cpan> install Jcode

  3. 起動スクリプトの作成

     logrotate後に、日本語コードを変換しWebalizerで解析するスクリプトを作成する。(赤字は日本語コード変換での変更内容)

    # vi /usr/local/bin/webalizer.sh

    #!/bin/sh
    # webalizer.sh
    APACHELOG='/usr/local/apache2/logs'
    /usr/sbin/logrotate $APACHELOG/logrotate.conf
    /bin/cat $APACHELOG/access_log.1 | perl /usr/local/bin/jconv > $APACHELOG/access_log_jpn
    /bin/cat $APACHELOG/akirin_log.1 | perl /usr/local/bin/jconv > $APACHELOG/akirin_log_jpn

    /usr/local/bin/webalizer -c /etc/webalizer_oyaji.conf
    /usr/local/bin/webalizer -c /etc/webalizer_akirin.conf

    [Esc],[:],[w],[q]で保存

  4. 既存のlogrotate.dからApacheのrotateデータを削除し、代わりにcronで0:01にwebalizer.shを起動する。

    # rm -f /etc/logrotate.d/httpd2
    # vi /etc/crontab
    1 0 * * * root /usr/local/bin/webalizer.sh

    [Esc],[:],[w],[q]で保存

    # /etc/rc.d/init.d/crond restart


■ ログ解析停止時の対処方法

ログ解析を Incremental モードで動作させていると、障害時にバックアップからログファイル等を戻したりすると、以後、解析が進まなくなることがあります。その場合の復旧方法を以下に示します。完全に復旧するためには、以下の条件を満たしている必要があります。
上記の条件を満たしていれば、以下の手順で完全に復旧できます。以下は、おやじの環境を前提に示しているので、実際には各人の環境に読み替えて作業してください。なお、作業はWebalizerが自動実行される前までに完了する必要があるので、十分に余裕をもって作業するか、自動実行を止めて復元後に起動するようにしてください。復元作業が、自動実行の時間を絶対に跨がないようにしてください。

  1. まずは、Webalizerの動作環境及び設定、ApacheのログファイルやWebalizerが作成したHTMLファイルやログを復元する。

  2. webalizer.conf(おやじの場合は、webalizer_oyaji.confとwebalizer_akirin.conf)の IncrementalName で指定したwebalizer.current (おやじの場合は、webalizer_oyaji.currentとwebalizer_akirin.current)ファイルを消去する。
     
  3. 復旧作業を自動化するスクリプトを適当な名前で作成する。おやじは、/usr/local/bin 配下に remake.sh という名前で作成した。


    # cd /usr/local/bin
    #
    vi remake.sh

    #!/bin/sh
    # remake.sh
    #
    # Webalizer log remake.

    APACHELOG='/usr/local/apache2/logs'

    i=30
    while [ $i -gt 0 ]
    do
         /bin/cat $APACHELOG/access_log.${i} | perl /usr/local/bin/jconv > $APACHELOG/access_log_jpn
         /bin/cat $APACHELOG/akirin_log.${i} | perl /usr/local/bin/jconv > $APACHELOG/akirin_log_jpn
         /usr/local/bin/webalizer -c /etc/webalizer_oyaji.conf
         /usr/local/bin/webalizer -c /etc/webalizer_akirin.conf
         i=`expr $i - 1`
    done

    [Esc],[:],[w],[q]で保存

    # chmod 755 remake.sh


    Apacheのログファイルを調査し、当月の一日のログファイルの追番 (access_log.xx の xxの部分) を上記スクリプトの i の初期値(赤字部分)に設定する。

  4. 後は、上記スクリプトを実行して、ひたすら解析が終わるのを待つだけ。サーバの性能やログの量にも依存するが、おやじの場合は、月末にこの作業をやると30分近くかかるので、じっくり待つしかない。


Top Pageへ