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のログファイルへのパス指定
おやじはApache2.0をソースからインストールしているので、下記のようになる。RedHat標準なら/var/log/httpd/access_log。
logrotate後にrotateしたファイルを解析するように処理を変更。(2003.09.23)
検索文字列が文字化けするので、文字コード変換後のファイルを解析するように変更。赤字に変更。(2003.12.06)
LogFile /usr/local/apache2/logs/access_log_jpn
(LogFile
/usr/local/apache2/logs/akirin_log_jpn)
- ログの種類を指定
今回は、Webのログ解析のみなのでデフォルトのままとする。WebalizerではFTPやSquidのログ解析も可能であり、その場合、「clf」をそれぞれ「ftp」、「squid」とすればよい。
LogType
clf
- 解析結果の出力先ディレクトリの指定(Apacheのドキュメントルート配下にしておくとブラウザでアクセスできる。必要ならディレクトリは別途作成しておく。)
OutputDir
/home/oyaji/public_html/webalizer
(OutputDir
/home/akirin/public_html/webalizer)
- webalizerの履歴を記録するためのファイル名を指定
一般的にはデフォルトのままでよい。今回は二つのサイトを解析するため、下記のようにした。
HistoryName
/var/lib/webalizer/webalizer_oyaji.hist
(HistoryName
/var/lib/webalizer/webalizer_akirin.hist)
- ログ解析の方法を指定
デフォルトの設定(no)では、常に最新の状態で解析され、logrotateされると古いログの情報が消えていってしまう。これを「yes」に変更することで、古いログ解析情報はそのままに、新しく変更があったログのみを追加解析するようになる。
Incremental
yes
- 上記項目をyesとしたときのログの追加情報に関するデータを格納するファイル名を指定
一般的にはデフォルトのままでよい。今回は二つのサイトを解析するため、下記のようにした。
IncrementalName
/var/lib/webalizer/webalizer_oyaji.current
(IncrementalName
/var/lib/webalizer/webalizer_akirin.current)
- 解析結果レポートのタイトルを指定
日本語化との関係がよく分からないが、とりあえずデフォルトのままで日本語化されるのでそのままとした。
ReportTitle
Usage Statistics for
- 解析対象のホスト名を指定
タイトルやレポート内のリンクに使用される。
HostName
www.aconus.com
- Webalizerが生成するレポートのHTMLファイルの拡張子を指定
一般的には、デフォルトのままで可。おやじは「htm」を基本にしているのでそれに合わせた。
HTMLExtension
htm
- ログ解析時にページ(ドキュメント)として認識する拡張子を指定
ドキュメントの構成に応じて設定すればよい。おやじは、いろいろCGIを動かしているので「htm*」のみとし、htm/htmlのみをカウントするようにした。
PageType
htm*
#PageType cgi
#PageType phtml
#PageType php3
#PageType pl
- ログ解析時、IPアドレスで採られたログをホスト名で表示する場合の指定(configure時にdnsオプション指定要)
ログ解析時、IPアドレスで採られたログをホスト名で表示する場合、毎回DNSの逆引きをしていると負荷・時間がかかる。そこで、Webalizerでは検索結果をキャッシュしており、そのためのファイルの指定と、逆引き時に動作させるプロセス数を指定する。プロセス数は多ければ多いほど早く処理されるが、負荷がかかるので5程度に留めたほうが良い。おやじは、こういう事態を避け負荷分散を図るためログ時にホスト名を引いている。従って、本項目はコメントアウト。
#DNSCache
dns_cache.db
#DNSChildren 5
- 各集計のTop
xとして表示する数(x)を指定。
各集計の上位何位までを表示するか指定する。表示したくない集計については、zeroとする。
TopSites
30
TopKSites 10
TopURLs 30
TopKURLs 10
TopReferrers
zero
TopAgents 15
TopCountries 30
TopEntry 10
TopExit
10
TopSearch 20
TopUsers zero
- 集計から隠したいサイトを指定(カウントには含まれる。)
自サイト内からのアクセスを隠すように設定。とは言うものの、おやじはApacheでのログ段階で家庭内からのアクセスは別のログファイルにしているので、この設定は盲腸である。
HideSite
*www.aconus.com
HideSite localhost
- 集計から隠したいリファラーを指定(カウントには含まれる。)
自サイト内での移動を隠すようにwww.aconus.comを設定。
HideReferrer
www.aconus.com
- 集計から隠したいURLを指定(カウントには含まれる。)
集計から隠したいURLを指定する。おやじは、デフォルト設定にCGI等を追加した。
HideURL
*.gif
HideURL *.GIF
HideURL *.jpg
HideURL *.JPG
HideURL *.png
HideURL *.PNG
HideURL *.ra
HideURL *.css
HideURL *.cgi
HideURL *.pl
- 集計したくないサイト/リファラー/URLを指定
ログ解析時、集計したくないサイト/リファラー/URLを指定。集計したくないサイトやURL等を指定する。例えば、隠しディレクトリ等が考えられる。
#IgnoreSite
bad.site.net
#IgnoreURL /test*
#IgnoreReferrer file:/*
#IgnoreAgent RealPlayer
#IgnoreUser root
■ Apacheの設定
Webalizerでリファラーを採りたい場合、Apacheのデフォルト設定ではログにリファラーが採られないため、httpd.confを変更する必要があります。
おやじのログ周りの設定を以下に示します。(先頭の数字は説明用です。) リファラーを採るには、8/10行目のようにデフォルトの「common」から「combined」に変更します。
- SetEnvIf Remote_Addr 192.168.1. homelog nolog
- SetEnvIf Request_URI "~akirin" akirinlog nolog
- SetEnvIf Request_URI "default.ida" wormlog nolog
- SetEnvIf Request_URI "root.exe" wormlog nolog
- SetEnvIf Request_URI "cmd.exe" wormlog nolog
- SetEnvIf Request_URI "Admin.dll" wormlog nolog
- CustomLog logs/home_log common env=homelog
- CustomLog logs/akirin_log combined env=akirinlog
- CustomLog logs/worm_log common env=wormlog
- CustomLog logs/access_log combined env=!nolog
- 1/7行目で、家庭内からのアクセスをhome_logに採取。
- 2/8行目で、娘のサイトへのアクセスをakirin_logに採取。
- 3行目でCodeRed、4〜6行目でNimudaからアタックを識別し、9行目でworm_logに採取。,
- 10行目で残りのアクセスをaccess_logに採取。おやじのサイトへのアクセスは、ここに含まれる。
■ 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の設定変更を忘れずに。
- 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]で保存
|
- 日本語コードの変換
コード変換用のスクリプトを作成し、/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 |
- 起動スクリプトの作成
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]で保存
|
- 既存の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が生成したHTMLファイルがそのまま残っている。
- 当月の、Apacheのログファイルが残っている。
- webalizer.conf (おやじの場合は、webalizer_oyaji.confとwebalizer_akirin.conf) の
HistoryName で指定したwebalizer.hist
(おやじの場合は、webalizer_oyaji.histとwebalizer_akirin.hist) が残っている。
上記の条件を満たしていれば、以下の手順で完全に復旧できます。以下は、おやじの環境を前提に示しているので、実際には各人の環境に読み替えて作業してください。なお、作業はWebalizerが自動実行される前までに完了する必要があるので、十分に余裕をもって作業するか、自動実行を止めて復元後に起動するようにしてください。復元作業が、自動実行の時間を絶対に跨がないようにしてください。
- まずは、Webalizerの動作環境及び設定、ApacheのログファイルやWebalizerが作成したHTMLファイルやログを復元する。
- webalizer.conf(おやじの場合は、webalizer_oyaji.confとwebalizer_akirin.conf)の
IncrementalName で指定したwebalizer.current
(おやじの場合は、webalizer_oyaji.currentとwebalizer_akirin.current)ファイルを消去する。
- 復旧作業を自動化するスクリプトを適当な名前で作成する。おやじは、/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 の初期値(赤字部分)に設定する。
- 後は、上記スクリプトを実行して、ひたすら解析が終わるのを待つだけ。サーバの性能やログの量にも依存するが、おやじの場合は、月末にこの作業をやると30分近くかかるので、じっくり待つしかない。
Top Pageへ