WebalizerによるWebアクセスログ解析(SuSE編)


Apache のログ解析ツールとして、SuSE にも Webalizer が用意されていましたので、RedHat と同様にこれを使うことにしました。サンプル(現在は、Redhatのもの)がこちらにありますが、RedHat と何も変わりはありません。
基本的には RedHat と変わりありませんが、提供されている RPM そのままではいくつか問題があったため少し見直しをしましたので、それを以下にあげておきます。
  1. バイナリパケージは日本語対応ができていないことと dns オプション付きなので、SRPM から 日本語対応の RPM を作成しなおした。

  2. RedHat の時と同様に、ログ量が多いと解析時間がずれログ解析中にlogrotateされるとおかしくなるので、タイミングでの処理をやめて logrotate 後にlogrotate したファイルを解析するようにした。あわせて、検索文字列の文字化け対策をした。
 

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

ここでは、Webalizer の SRPM をダウンロードし、日本語対応等を折り込んだ RPM を作成してインストールします。

  1. Webalizer の SRPM を、/usr/src/packages/SOURCES 配下に KDDI の FTPサイトからダウンロードし、展開する。おやじがダウンロードしてきたのは、webalizer-2.01-560.src.rpm である。KDDI のサイトは非常に込み繋がらないことがあるので他のサイトでも構わないが、残念ながら Novell のサイトには SRPM は置いていない。

    # cd /usr/src/packages/SOURCES
    # wget ftp://ftp.kddlabs.co.jp/Linux/packages/SuSE/suse/i386/9.0/suse/src/webalizer-2.01-560.src.rpm
    # rpm -Uvh webalizer-2.01-560.src.rpm


  2. /usr/src/packages/SPECS 配下に展開された webalizer.spec を、日本語対応、dns オプションなしに変更してコンパイルしなおす。 日本語対応では、グラフ表示を日本語表示にします。また、デフォルトでは dns オプション付きで作成されていますが、おやじは Apacheでログを採るときに既にホスト名でログを採取しており、このオプションを指定するとエラーになるので削除した。IP アドレスでログは採っているが Webalizer ではホスト名で表示したい場合は、そのまま configure で dns オプション指定を残すこと。

    # cd /usr/src/packages/SPECS
    # vi webalizer.spec

     (snip)

    build
    %{suse_update_config -f}
    autoconf
    CFLAGS="$RPM_OPT_FLAGS -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" ./configure --prefix=/usr \
         --with-gdlib=%{_libdir} \
         --with-gd=/usr/include/gd \
         
    --with-language=japanese \
         --mandir=%{_mandir} \
         
    --enable-dns \
         %{_target_cpu}-suse-linux
    make LIBNAME=%{_lib}

     (snip)

    「Esc」、「:」、「w」、「q」で保存。

    # rpmbuild -ba webalizer.spec


  3. 上記で、日本語対応版の RPM が /usr/src/packages/RPM/i586 配下に作成されるので、確認しインストールする。

    # cd /usr/src/packages/RPM/i586
    # ls
    webalizer-2.01-560.i586.rpm
    # rpm -Uvh webalizer-2.01-560.i586.rpm


    注: 手動で RPM をインストールすると、YaST 上は「保護されている−変更しない」パッケージとして扱われ、自動アップデートされなくなる。当然、書き換えられては困るので非常にうまくできているが、自己管理になるので注意が必要である。

■ Webalizerの設定

Webalizer の設定は、インストール時に作成される /etc/webalizer.conf をベースに作成していきます。一般的には、このファイルをそのまま設定していけばいいと思います。おやじの場合は、おやじと娘のサイトでログを分けていますので、それぞれについて /etc/webalizer_oyaji.conf と /etc/webalizer_akirin.conf を作成しました。なお、デフォルトの webalizer.conf が存在すると、作成した conf ファイルに不具合があるとこのファイルを使おうとするので、リネームしておくことを薦めます。

# cp /etc/webalizer.conf /etc/webalizer.conf.bak
# cp /etc/webalizer.conf.bak /etc/webalizer_oyaji.conf
# cp /etc/webaiizer.conf.bak /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 /var/log/apache2/home_log common env=homelog
  8. CustomLog /var/log/apache2/akirin_log combined env=akirinlog
  9. CustomLog /var/log/apache2/worm_log common env=wormlog
  10. CustomLog /var/log/apache2/access_log combined env=!nolog

■ Webalizerの起動

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

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

    # logrotate.conf
    daily
    rotate 31
    create
    /var/log/apache2/*log {
        missingok
        sharedscripts
        postrotate
          /etc/init.d/apache2 reload
        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='/var/log/apache2'
    /usr/sbin/logrotate /usr/local/bin/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/bin/webalizer -c /etc/webalizer_oyaji.conf
    /usr/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/apache2
    # vi /etc/crontab
    1 0 * * * root /usr/local/bin/webalizer.sh

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

    # /etc/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='/var/log/apache2'

    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/bin/webalizer -c /etc/webalizer_oyaji.conf
         /usr/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へ