Webサーバのアクセス解析をしよう
| いちばん近道なLinuxマスター術 Analogによるアクセスログの解析 |
|
| 自分で管理しているホームページであれば,商用,個人を問わず,どの程度のアクセスがあるのかが気になるはずだ。第5回目の今回は,Webサーバ(Apache)で記録される難解なログを見やすく表示できる,アクセスログ解析ツールの導入と設定方法を紹介しよう。 |
| Webサーバのアクセス解析をしよう |
Webサーバの運用を始めると,誰がどのアクセスポイントから,どの程度アクセスしているなどが気になるだろう。ましてや,企業のホームページやショッ ピングサイトなどの場合には,費用対効果の面からもサイトのアクセス状況を把握しておくのは必須といえる。
そこで判断材料となるのがWebサーバから書き出されるログファイルだ。しかし,Apacheを始めとするWebサーバソフトで書き出されたログは,そのままの状態でアクセス動向を把握するのは至難の技だ。見やすく加工するまでには,かなりの手間や時間が必要になる。
このような場合に利用したいのが「アクセスログ解析ツール」と呼ばれるソフトウェアである。アクセスログを解析するツールは,Webが普及し始めたころから存在し,現在では商用サイトの戦略的な分析を専門として行う業者もあるほどだ。
ここでは一般に広く利用されている「Analog」と呼ばれるツールの設定方法について解説していこう。Analogは,後述するように柔軟性の高いログフォーマット読み込みをサポートし,詳細なアクセス状況を把握するには十分な性能を持ち備えている。
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のコンパイルは完了である。
ここまでの設定が終わったら,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 |
Analogの設定ファイル「analog.cfg」内容を詳しく見る前に出力されるレポートの概観設定について触れておこう。
一般のユーザーがいちばん最初に気になるであろう「出力レポートの日本語化」と,「IPアドレスのホスト名への変換」の設定方法を解説する。この設定を通して,analog.cfgを理解していただきたい。
作成されたレポートを見ていちばん最初に気づくのは,表示されている言語が英語であることだろう。簡単な単語が多いものの,ログの量が多いことからも日本語で表示させたいと思う人が多いはずだ。そこで,レポートで使用さ れる言語を日本語にする方法を紹介しよう。
実は,Analog 4.11では日本語のメッセージファイルが既に用意されている。このため,設定を切り替えるだけで日本語利用ができるのだ。
具体的には,analog.cfgファイルの中で,次のように指定するだけでよい。
| LANGFILE lang/jp.lng |
このように指定すると,日本語が使用されるようになる。

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アドレスへの参照を何度も行ってしまうことはない。
さらに,analog.cfgの詳細について解説していこう。次のリストは,Analogのインストール直後の状態であり,何の修正も加えていないファイルだ。
次にこの中に含まれるコマンドを順番に挙げてみた。ただし,詳細までは触れることができないため,あくまでも基本的な事項に限定している。
「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]」という説明付きで出力される。
Apacheでは,出力されるログフォーマッ ト(書式)を自由にカスタマイズすることができる。たとえば,リンク元のページである「HTTP_REFERER」を記録することもでき,クライアントのブラウザ種別「USER_AGENT」を記録することも可能だ。
ここで注意しなければならない点がある。それは,上記のように記録する項目や書式をカスタマイズしたログを使用している場合,Analogの標準設定のままではログ解析をすることができない点だ。
このため,Analog側でログの書式を指定する方法が用意されている。次に,具体的な設定方法を交じえながらログフォーマットを変更する方法を解説していこう。
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」の書式でログを記録することができるようになる。
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 | タブ文字 |
| \\ | 「\」自身 |
ここで実際の指定方法を説明してみよう。たとえば,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 の持つ強みといえるだろう。
ログフォーマットを指定する場合には次のような点に気をつけなければならない。「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) |
ここでは,一般的に利用頻度の高いと思われるコマンド一覧と,その設定内容および設定例を挙げよう。ここに挙げたもの以外にも多数の設定コマンドがあるので,興味のある人は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 |
ログ書式の指定コマンドは,読み込むログファイルの書式を指定する。詳細は,「ログのフォーマットを指定する」,および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 |