Webサーバのアクセス解析をしよう

 いちばん近道なLinuxマスター術
Analogによるアクセスログの解析
自分で管理しているホームページであれば,商用,個人を問わず,どの程度のアクセスがあるのかが気になるはずだ。第5回目の今回は,Webサーバ(Apache)で記録される難解なログを見やすく表示できる,アクセスログ解析ツールの導入と設定方法を紹介しよう。

第5回 Webサーバのアクセス解析をしよう

 Webサーバの運用を始めると,誰がどのアクセスポイントから,どの程度アクセスしているなどが気になるだろう。ましてや,企業のホームページやショッ ピングサイトなどの場合には,費用対効果の面からもサイトのアクセス状況を把握しておくのは必須といえる。

 そこで判断材料となるのがWebサーバから書き出されるログファイルだ。しかし,Apacheを始めとするWebサーバソフトで書き出されたログは,そのままの状態でアクセス動向を把握するのは至難の技だ。見やすく加工するまでには,かなりの手間や時間が必要になる。

 このような場合に利用したいのが「アクセスログ解析ツール」と呼ばれるソフトウェアである。アクセスログを解析するツールは,Webが普及し始めたころから存在し,現在では商用サイトの戦略的な分析を専門として行う業者もあるほどだ。

 ここでは一般に広く利用されている「Analog」と呼ばれるツールの設定方法について解説していこう。Analogは,後述するように柔軟性の高いログフォーマット読み込みをサポートし,詳細なアクセス状況を把握するには十分な性能を持ち備えている。

icon ソースをダウンロードして
インストールしよう

 Analogのインストールは非常に簡単である。ダウンロード後にソースコードを展開したら, 「anlghead.h」の中の「ANALOGDIR」という項目を自分の環境に合わせて変更する。これが必須となる設定項目だ。

 Analogは一般的なフリーソフトウェアとは違い,コンパイルした後にインストールを行うのではなく,「ソースコードを展開した場所(ディレクトリ)」が「インストールする場所(ディレクトリ)」となる。このためコンパイルする前にディレクトリに注意する必要がある。今回は,/usr/local/etcに展開している例を挙げよう。

1. Analogのインストール
# pwd
/usr/local/etc
# tar zxf /usr/local/src/analog-4.11.tar.gz
# mv analog-4.11 analog
# cd analog
# vi anlghead.h

 インストール後は,前述したanlghead.hファイルに設定されている「ANALOGDIR」と 「LOGFILE」を必要に応じて変更しよう。

2. anlghead.hを編集する
#define ANALOGDIR "/usr/local/analog-4.11/"
#define LOGFILE "/usr/local/apache/logs/access_log"

 ここでは「ANALOGDIR」を次のように変更した。

#define ANALOGDIR "/usr/local/etc/analog/"

 次にmake処理を行う。

# pwd
/usr/local/etc/analog
# make

 以上の操作で,Analogのコンパイルは完了である。

icon Analogを動かしてみよう

 ここまでの設定が終わったら,Analogを実行してみよう。

# pwd
/usr/local/etc/analog
# ./analog

  レポート内容は,OUTFILEを指定していれば設定されたファイルに,指定していなければ標準出力にHTML形式で出力される。出力されたファイルをWebブラウザで表示してみるとよい。「月別,曜日別,時間別,ドメイン別など」のレポートが作成されているはずだ。

 なお,レポート内で利用される画像ファイルへのリンクが切れていて棒グラフが描画されない場合もある。このような場合には,レポートを作成するディレクトリにAnalogディレクトリ内 の「images/」ディレクトリを丸ごとコピーすればよい。たとえば,「/home/snaga/analog.html」というファイルで作成した場合には,次のように 「/home/snaga」ディレクトリに「images/」をコピーするのだ。

~% /usr/local/etc/analog/analog > /home/snaga/analog.html
~% cp -r /usr/local/etc/analog/images /home/snaga


icon 簡単なカスタマイズ

 Analogの設定ファイル「analog.cfg」内容を詳しく見る前に出力されるレポートの概観設定について触れておこう。

 一般のユーザーがいちばん最初に気になるであろう「出力レポートの日本語化」と,「IPアドレスのホスト名への変換」の設定方法を解説する。この設定を通して,analog.cfgを理解していただきたい。

icon レポートメッセージを日本語化してみよう

 作成されたレポートを見ていちばん最初に気づくのは,表示されている言語が英語であることだろう。簡単な単語が多いものの,ログの量が多いことからも日本語で表示させたいと思う人が多いはずだ。そこで,レポートで使用さ れる言語を日本語にする方法を紹介しよう。

 実は,Analog 4.11では日本語のメッセージファイルが既に用意されている。このため,設定を切り替えるだけで日本語利用ができるのだ。

 具体的には,analog.cfgファイルの中で,次のように指定するだけでよい。

LANGFILE lang/jp.lng

 このように指定すると,日本語が使用されるようになる。
画面

icon 標準では逆引き記録設定がされていない

 Apacheの標準設定(httpd.conf)では,IPアドレスからホスト名を逆引きしないようになっている。 httpd.confの「HostnameLookups」項目が「off」に設定されている場合が多い。これは,httpサーバにアクセスのあるたびに逆引きするのではレスポンスが遅くなるからである。

 しかし,Analogなどでドメインごとのアクセス数などを調べるためにはホスト名を知る必要がある。Analogでは「ドメインレポート」としてドメインごとの統計を表示させることができるが,標準設定では「未解決アドレス」が100%となっており,このレポートが意味をなさない状態である。

 そこでホスト名の逆引きを行って,ドメイン別のレポートを作成してみよう。

 Analogでは,DNSに問い合わせをする時間を稼ぐために,いちど調べた内容をキャッシュファイルに保存することが可能だ。このキャッシュファイル名は,analog.cfgの中で,

DNSFILE dnsfile.txt

 として設定される。また,どのようにホスト名の解決を行うかについては,次のような解析レベルが用意されている。

レベル 動作
NONE IPアドレスからホスト名への変換をしない(標準設定)
READ DNSFILEから読み込むが新たな名前解決はしない(DNSを参照しない)
WRITE DNSFILEから読み込んで,DNSFILEにないアドレスはDNSを参照してDNSFILEに追加する
LOOKUP DNSFILEから読み込んで,DNSFILEにないアドレスはDNSを参照するがDNSFILEには追加しない

 たとえば,「WRITE」を指定したいのであれば,次のような構文になる。

DNS WRITE

 上表の通りDNSFILEを利用しながら名前解決を行う設定だ。さらに,DNSFILEに存在しないアドレスはDNSで調査されてその結果をDNSFILEに反映しながらレポート作成をする。

 また,2つ以上のAnalogが同時にDNSFILEに書き込みを行うとファイルが破壊されてしまうため,ロックファイルを作成するようになっている。ロックファイルが存在する場合には,ほかのAnalogのプロセスがDNSFILEを使用中であると判断して,WRITEモードからLOOKUPモードに動作変更される。このロックファイルは,以下のように「DNSLOCKFILE」によって指定する。

DNSLOCKFILE dnsfile.lock

 なお,DNS情報は変更されることがあるため,DNSFILEがいつでも正式なものだとは限らない。そのため,DNSFILE内を情報参照する有効期限を設定することができる。

DNSGOODHOURS 672

 上記のように指定すると,指定した時間を経過したキャッシュ情報は使用しなくなる。「時間」による指定になるため「672」 と指定した場合には「672時間(4週間)」以内はキャッシュ内のIPアドレス/ホスト情報が利用されるのだ。

 DNSGOODHOURSとは別に,いちど逆引きに失敗したIPアドレスを一定期間は逆引きしないように設定することもできる。これによって,逆引きできないIPアドレスへの参照を何度も行ってしまうことはない。

icon analog.cfgファイルの詳細を知ろう

 さらに,analog.cfgの詳細について解説していこう。次のリストは,Analogのインストール直後の状態であり,何の修正も加えていないファイルだ。

 次にこの中に含まれるコマンドを順番に挙げてみた。ただし,詳細までは触れることができないため,あくまでも基本的な事項に限定している。

リスト
別ウィンドウで見る or 05a5.txt

「LOGFILE」
 読み込むログファイル名を指定する項目だ。指定しない場合にはAnalogを実行できないため重要である。

「OUTFILE」
 レポートを出力するファイルを指定する項目だ。指定しない場合には標準出力(ディスプレイ上)に出力される。

「HOSTNAME」
 ホスト名を指定する項目だ。

「REQINCLUDE」
 ログ解析の対象となるリクエストされたオブジェクトを指定する項目だ。「pages」と指定された場合には,画像ファイルなど「HTMLなどのテキストファイル以外」は解析対象に含まない。

「LINKINCLUDE」
 リクエストレポートの中で,該当するページへのリンク作成をする項目だ。これによって,レポート内からアクセスの多いページにリンクすることができるようになる。

「REFLINKINCLUDE」
 参照レポートの中で該当するページへのリンク作成をする。

「UNCOMPRESS」
 圧縮したファイルを展開するコマンドを指定する。

「BROWOUTPUTALIAS」
 ブラウザ情報の文字列を,ほかの文字列で置き換えてレポート出力する。たとえば,

BROWOUTPUTALIAS "Mozilla (compatible)" "Netscape (compatible)"

 と指定した場合には,「Mozilla (compatible)」という文字列は,「Netscape (compatible)」とみなされる。

「SEARCHENGINE」
 サーチエンジンでの検索キーワードを調べるための設定項目。サーチエンジンの検索結果のリンクをたどってきた場合には,通常は,

http://www.altavista.com/cgi-bin/query?pg=q&kl=XX&q=carrot+cake

 のような参照(REFERER)ログが「referer_log」ファイルに記録される。この場合,「q=」の「=」から後の部分が検索キーワードであり,ここでは「carrot cake」というキーワードで検索されたことが分かる。

 Analogでは,SEARCHENGINEというコマンドを利用することで任意のサーチ エンジンからの情報を得ることも可能だ。SEARCHENGINEコマンドの記述方法は次のようになっており,

SEARCHENGINE [サーチエンジンURL] [フィールド名]

 具体的には,

SEARCHENGINE http://*altavista.*/* q

 のように設定すればよい。

「SUBTYPE」
 列挙したファイルを同じタイプのファイルとみなす設定だ。

「TYPEOUTPUTALIAS」
「BROWOUTPUTALIAS」と同じく,拡張子をほかの文字列に置き換えてレポート出力する設定項目だ。

TYPEOUTPUTALIAS .html ".html [Hypertext Markup Language]"

 上記のように記述すると,「.html」ファイルについてのレポートの際に,「.html [Hypertext Markup Language]」という説明付きで出力される。

icon カスタマイズされたログフォーマットにも対応できる

 Apacheでは,出力されるログフォーマッ ト(書式)を自由にカスタマイズすることができる。たとえば,リンク元のページである「HTTP_REFERER」を記録することもでき,クライアントのブラウザ種別「USER_AGENT」を記録することも可能だ。

 ここで注意しなければならない点がある。それは,上記のように記録する項目や書式をカスタマイズしたログを使用している場合,Analogの標準設定のままではログ解析をすることができない点だ。

 このため,Analog側でログの書式を指定する方法が用意されている。次に,具体的な設定方法を交じえながらログフォーマットを変更する方法を解説していこう。

icon Apacheのログフォーマット

 Apacheを利用している場合,ログの書式は「LogFormat」というオプション (ディレクティブ)によって指定される。一般的なアクセスログの書式は,

LogFormat "%h %l %u %t \"%r\" %>s %b" common

 と指定されている。ここでは「%h %l %u %t \"%r\" %>s %b」という書式に 「common」という別名を割り振っていて,この書式名を「CustomLog」というディレクティブで次のように指定している。

CustomLog /usr/local/apache/logs/access_log common

 このように設定しておけば,「/usr/local/apache/logs/access_log」 というファイルに「common」の書式でログを記録することができるようになる。

icon ログフォーマットの指定方法

 Analogで解析するログの書式を指定する場合には,「APACHELOGFORMAT」,あるいは「LOGFORMAT」というオプションを利用する。

 書式の要素として,クライアントのIPアドレスや日時,リクエストされたファイル名などがある。これらの組み合わせによって一つの書式を構成し,その書式に沿ってログファイルを解析するのだ。

 たとえば,次のように指定するとひとつの行が「クライアントのIPアドレスまたはホスト名」, 「ひとつのスペース文字」,「リクエストされたファイル名」から構成されるログファイル書式になる。

LOGFORMAT (%S %r)

 ただし実際のログファイルはこれほど簡単な書式ではなく,Apacheの一般的な設定ではユーザー名(認証時) や時刻,転送バイト数やHTTPステータスなどが含まれている。

APACHELOGFORMAT
「APACHELOGFORMAT」は,その名の通りApacheのLogFormatと同じ文法でログ書式を指定するためのオプションである。ApacheのLogFormatディレクティ ブの「"」から「"」までの間の文字列を,AnalogのAPACHELOGFORMATで「(」と 「)」でくくって指定する。たとえば,ApacheのLogFormatが次のように,

LogFormat "%h %l %u %t \"%r\" %>s %b" common

 として指定されている場合には,AnalogのAPACHELOGFORMATは,

APACHELOGFORMAT (%h %l %u %t \"%r\" %>s %b)

 と指定する。

 Apacheのログ書式を自分でカスタマイズしている場合には,こ のオプションを使用して指定することができるのだ。基本的にはApacheのLogFormatの指定をカットアンドペーストしてくれば特に問題ないだろう。

 なお,APACHELOGFORMATによる書式指定方法は,ApacheのLogFormatの文法と同じため,詳しくはApacheのマニュアルを参照してほしい。

 ただし,ApacheのCustomLogで利用される「%{Referer}i」や, 「%{User-agent}i」といった指定方法は,APACHELOGFORMATでは利用できない。このため,ログ形式にこれらの指定を行っている場合には,APACHELOGFORMATではなく後述するLOGFORMATで指定する必要がある。

LOGFORMAT
 LOGFORMATを利用すると,Apache以外のWebサーバを利用している場合のロ グ書式を指定することができる。書式を,「(」と「)」で囲って指定する書式は,APACHELOGFORMATと同じである。

 また,LOGFORMATを使った場合の書式指定には,以下のような要素を利用することができる。

%S クライアントのホスト名またはIPアドレス
%s クライアントのIPアドレス
%r リクエストされたファイル
%q QUERY_STRING
%B ブラウザ名
%A ブラウザ名(スペースを「+」に置換したもの)
%f 参照元(リンク元)
%u ユーザー名
%v バーチャルドメインのホスト名
%d 日(数字)
%m 月(数字)
%M 月(英字3文字)
%y 年(西暦下2桁)
%Y 年(西暦4桁)
%h
%n
%a 午前(A)もしくは午後(P)
%U 現時刻(1970年からの秒数)
%b 転送バイト数
%t 処理時間(秒)
%T 処理時間(ミリ秒)
%c HTTPステータスコード
%j ジャンク(無視される。空でもよい)
%w 空白文字(1つ以上のスペースかタブ)
%W 空白文字(0つ以上のスペースかタブ)
%% 「%」自身
\n 改行
\t タブ文字
\\ 「\」自身


icon ログ書式指定の実際

 ここで実際の指定方法を説明してみよう。たとえば,Apacheのreferer_logをカスタマイズして記録していたとしよう。 一般的にreferer_logはhttpd.conf内で次のような形式で設定されている。

LogFormat "%{Referer}i -> %U" referer

 しかし,このreferer_logには時刻情報が含まれていないため,ApacheのCustomLogで時間情報を付加している必要がある。具体的には,次のように設定している場合を挙げよう。

LogFormat "%t %{Referer}i -> %U" referer

 すると,実際のreferer_logには次のように記録される(2行)。

[11/Sep/2000:00:33:11 +0900] http://www.goo.ne.jp/default.asp?MT=VAIO+redhat&WTS=ntt&SM=MC&DE=2&DC=10&_v=2 -> /linux/vaio
[11/Sep/2000:00:33:12 +0900] http://www.goo.ne.jp/default.asp?MT=VAIO+redhat&WTS=ntt&SM=MC&DE=2&DC=10&_v=2 -> /linux/vaio/

 このログ形式では,Apacheの一般的な形式には当てはまらないためカスタマイズする必要がある。しかし,「%{Referer}i」という変数を利用しているために,APACHELOGFORMATを用いて指定することはできない。この情報を元にログ解析を行うには,LOGFORMATで次のように設定する必要がある。

LOGFORMAT ([%d/%M/%Y:%h:%n:%j +0900] %f -> %r)
LOGFILE /usr/local/httpd/logs/referer_log

 ApacheのCustomLogで使用した「%t」,つまり時刻情報を,AnalogのLOGFORMATでは「[%d/%M/%Y:%h:%n:%j +0900]」と書式指定するとAnalogで利用することができるようになる。

 このように,Apacheでカスタマイズされたログファイルであっても,LOGFORMATを用 いて書式を自由に指定できるのだ。柔軟に解析ログを作成できるのがAnalog の持つ強みといえるだろう。

icon ログ書式指定の際の注意

 ログフォーマットを指定する場合には次のような点に気をつけなければならない。「APACHELOGFORMAT」や「LOGFORMAT」といったオプションは「LOGFILE」,すなわちログファイルを指定する前に指定しなければならないという点だ。たとえば,

LOGFILE access_log

 と,「access_log」ファイルを指定している場合には,次のように「LOGFILE」の前に書式を指定しなければならない。

APACHELOGFORMAT (%h %l %u %t \"%r\" %>s %b)
LOGFILE access_log

 しかし,次のようにaccess_log定義の下に記述してしまった場合には,設定が有効にならないので注意が必要だ。

LOGFILE access_log
APACHELOGFORMAT (%h %l %u %t \"%r\" %>s %b)

icon リファレンス

 ここでは,一般的に利用頻度の高いと思われるコマンド一覧と,その設定内容および設定例を挙げよう。ここに挙げたもの以外にも多数の設定コマンドがあるので,興味のある人はAnalogのマニュアルを参照してほしい。

基本コマンド
コマンド 説明 設定例
HOSTNAME ホスト名 MyDomain
HOSTNAME ホストのURL http://www.mydomain.com
LOGFILE ログファイル access_log
OUTFILE レポート出力ファイル analog.html
LANGFILE 言語ファイル lang/jp.lng
DNS DNSとキャッシュファイルの扱い NONE / WRITE / READ / LOOKUP
DNSFILE DNS情報のキャッシュファイル dnsfile.txt
DNSLOCKFILE DNSFILEのためのロックファイル dnsfile.lck
DNSGOODHOURS キャッシュの有効期限(時間) 672
DNSBADHOURS 逆引き失敗の際の猶予期間(時間) 24
SEARCHENGINE サーチエンジンの検索の書式 http://*altavista.*/* q


icon ログ書式指定コマンド

 ログ書式の指定コマンドは,読み込むログファイルの書式を指定する。詳細は,「ログのフォーマットを指定する」,およびAnalogのマニュアルを参照してほしい。

コマンド 説明 設定例
LOGFORMAT ログフォーマットの指定 ([%d/%M/%Y:%h:%n:%j +0900] %f -> %r)
APACHELOGFORMAT ログフォーマットの指定(Apache方式) (%h %l %u %t \"%r\" %>s %b)

レポートコマンド
 レポート関連のコマンドでは,どのような種類のレポートを出力するかを 「ON」または「OFF」で指定する。たとえば,曜日別レポートを出力する場合には,次のように指定すればよい。

WEEKLY ON

 下に挙げる表内で,「*」のついているレポートは標準で出力されるようになっている。しかし,OSレポートや検索語レポートを出力するために必要な情報は,Apacheの一般的なaccess_logには記録されない。それぞれ,agent_logやreferer_logをLOGFILEとしてanalog.cfgで指定しなければならな いことに注意してほしい。

コマンド 説明 設定例
GENERAL (*) 全体の概要 ON / OFF
MONTHLY (*) 月別レポート ON / OFF
WEEKLY (*) 週別レポート ON / OFF
FULLDAILY (*) 日別レポート ON / OFF
DAILY 曜日別レポート ON / OFF
HOURLY (*) 時間別レポート ON / OFF
QUARTER 15分間隔レポート ON / OFF
FIVE 5分間隔レポート ON / OFF
HOST ホストレポート ON / OFF
ORGANISATION (*) 組織別レポート ON / OFF
DOMAIN (*) ドメインレポート ON / OFF
REQUEST (*) リクエストレポート ON / OFF
DIRECTORY (*) ディレクトリレポート ON / OFF
FILETYPE (*) ファイル種類別レポート ON / OFF
SIZE (*) ファイルサイズレポート ON / OFF
PROCTIME 解析時間レポート ON / OFF
REDIR リダイレクションレポート ON / OFF
FAILURE 失敗したリクエストレポート ON / OFF
REFERER リンク元URLレポート ON / OFF
REFSITE リンク元サイトレポート ON / OFF
SEARCHQUERY 検索結果レポート ON / OFF
SEARCHWORD (*) 検索語レポート ON / OFF
REDIRREF リダイレクトされたリンク元URLレポート ON / OFF
FAILREF 失敗したリンク元URLレポート ON / OFF
FULLBROWSER ブラウザレポート ON / OFF
BROWSER ブラウザの概要 ON / OFF
OSREP (*) OSレポート ON / OFF
VHOST バーチャルホストレポート ON / OFF
USER ユーザレポート ON / OFF
FAILUSER 失敗したユーザレポート ON / OFF
STATUS (*) ステータスコードレポート ON / OFF