Analogを使ってオリジナルのアクセスログ解析ツールを作る | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

アクセスログ解析ツールには、様々なものが出ていて何故いまさらAnalog?というところもあるのですが、歴史が古いツールだけあって、柔軟性に富んだ機能があります。


個人ブログのアクセス解析をしたいといった場合は、Google AnalyticsやYahoo!アクセス解析などを使っていれば十分だと思います。

Analogなどのツールに頼るのは、そういったオープンサービスが使えない状況です。

例えば、企業内ポータルのアクセスログ解析を実施したいといった場合があります。


ここでは、Analogの使い方や解析結果のレポート(HTML)の見方を詳しく解説すると言うよりは、オリジナルのアクセスログ解析を行うために、Analogをどう使うかというところを中心に書いています。

なお、ここではLinux上でAnalogを使い、WebサーバーにはApacheを使っているものとしています。



Analogをインストールする


ソースのダウンロードですが、本家のサイト より行えます。

バージョンは最新(といっても2004年にリリースされたものですが)の6.0を使います。


ソースを解析用サーバー上に上げたら、展開してコンパイル(といってもmakeだけ)します。


# cd /usr/local/src/analog-6.0

# make

# ls -la
- snip -

-rwxr-xr-x 1 root root 522049 Jul 21 11:59 analog

- snip -

analogのソースディレクトリ内にanalogという実行プログラムができていれば完了です。



Web上に解析結果を表示してみる


まずは、Analogにアクセスログ解析をさせてみて、Web上に解析結果を表示させてみたいと思います。

アクセス解析を実行するには、先ほど作成した実行プログラムに渡すための設定ファイルを作成する必要があります。


デフォルトでは、Analogのソースディレクトリ直下にanalog.cfgという設定ファイルができています。

これを利用してもいいですが、非常に設定が細かくわかりづらいので、オリジナルの新しい設定ファイルを作ることにします。


デフォルトの設定ファイルには、検索エンジンに関する設定などが盛り込まれてたりしますが、企業内ポータルサイトのアクセスログ解析では、そのようなものは必要ないでしょう。

Analogにはリクエスト数の解析やファイルタイプの分析、検索エンジンや検索ワードによる分析も行えたりしますが、ここでは純粋にどのページにどれだけのアクセスがあったのかを調べるために、日時ごとにどれだけのアクセスがあったのかと、そのアクセスを細かいリクエスト単位で見ていく設定を追加することにします。


作った設定ファイルはこんな感じです。


#ログファイルのパス
LOGFILE /var/log/httpd/access_log*

# Analogの全てのレポートをOFFにする
ALL OFF

# 概要や解析日などの情報を表示しなくする
GENERAL OFF
DESCRIPTIONS OFF

# 日別のリクエスト数レポートを表示する
DAILYREP ON

# リクエスト別レポートを表示する
REQUEST ON

# リクエスト別レポートの中に表示するのは最低1リクエストあったファイル
REQFLOOR 1r

# パラメータが違うなどリクエストも全て表示する
REQARGSFLOOR 1r

# リクエスト集計の対象はHTMLファイル、PHPファイル
REQINCLUDE *.htm*,*.php*

# リクエスト数のみを表示
REQCOLS R

# レポートの表示は日本語で表示
LANGUAGE JAPANESE


最初のLOGFILEディレクティブには、Apacheのログファイルのパスを指定します。

最後にアスタリスクをつけることで、ログローテーションさせた全てのログファイルも対象に含まれるようにしています。

大量のログファイルがあった場合、解析に時間がかかることもあるため、予め解析対象のログファイルを固定して実行するとか、ログローテーションを工夫して、解析単位(例えば毎日とか月ごととか)ごとにログファイルを作成するようにしておけばよいと思います。


予断ですが、Analogに解析させるアクセスログは、時系列にそろって無くても問題ありません

ですので、存在する全てのログファイルを1ファイルに結合させて、解析させても問題ないですしし、負荷分散をしていて、同一時間帯に異なるサーバーにあったアクセスログを1まとめにしてもきちんと解析してくれます。


- 参考記事

logrotateでローテーションされるファイル名を変更する


logrotateでログファイルがローテーションされない事への対処



次の、ALLディレクティブでは全ての解析レポートを無効にしていますが、その後にDAILYREP(日にちごとのリクエスト数集計)とREQUEST(リクエストごとの集計)を有効にすることで余計なレポートを作成しないようにしています。


REQFLOORディレクティブでは、最低1リクエストあったものを結果のレポートに出力するようにしています。

デフォルトでは、20リクエスト以上ないものはレポートには表示されません

リクエストの総合計にはそれらのリクエスト数も含まれていますが、レポート(HTML)上には細かなリクエストが表示されないので、見る人によっては混乱してしまいます。


REQINCLUDEディレクティブでは、リクエストレポートの解析対象の拡張子を指定しています。

画像ファイルやJavaScriptファイル、faviconなどのリクエストを除きたい場合は、解析対象のファイルを指定しておきましょう。


REQCOLSディレクティブは、リクエストレポートにリクエスト数のみを表示させる設定です。

デフォルトでは、リクエスト数以外にもファイル容量の割合が表示されます。

それほど重要な要素ではないため、リクエスト数のみを表示するように指定しています。

その他にも細かなオプションを指定することができますが、それらはWeb上のマニュアル を参照してください。(リンク先は5.24のマニュアルですが、さほど違いはありません)

準備ができたら、Analogを実行させ解析結果のHTMLファイルを作ってみます。


# /usr/local/src/analog-6.0/analog +F090701:0000 +T090731:2359 +g/home/hoge/org-analog.cfg +O/var/www/analog/analog.html


最初に、+Fで解析対象の開始日時を、+Tで解析対象の終了日時を指定しています。

上記の場合は、2009年7月分ってことになりますね。(年は下2桁のみ指定します)


次に、+gオプションで先ほど作成したオリジナルの設定ファイルを読み込むようにしています。

そして最後の、+OオプションでレポートのHTMLファイルの出力先を指定しています。


これらは、設定ファイル内に記述することもできますが、日にちごとに設定ファイルを書き換えたり出力先を編集するのは面倒なので、Analog実行時に指定するようにしています。



Analogの解析レポート(HTMLファイル)を見てみる


出力したHTMLファイルにアクセスしてみると、まず一番上の項目には、解析結果の概要が出力されます。


A Day In The Boy’s Life-Analogレポート-1


解析対象日時には、2009年7月中のものを指定しましたが、レポート上の解析対象期間は異なっています。

これは、ログの中身を実際に見てみて、期間内で最も古い日時と新しい日時を抽出したものになります。

全体の概要としては、かなり大雑把な数字しか出ていませんので、それほど細かく見るところも無いと思います。


次に、日別のリクエストレポートです。


A Day In The Boy’s Life-Analogレポート-2


サンプルに作ったログが少なかったため、1日分しか表示されていませんが、実際には解析対象に指定した日時のリクエスト数がずらっと並びます。

毎日どれだけのアクセスがあったのかを見たい場合に有効なデータですね。


次に、リクエスト別のレポートです。

こちらは、まず円グラフが表示されます。


A Day In The Boy’s Life-Analogレポート-3


円グラフに続いて、詳細なリクエストごとの数値が表示されます。


A Day In The Boy’s Life-Analogレポート-4


どのファイルにどれだけのアクセス数があったのかがわかります。

ただし、これは解析対象期間での総合計になっています。
日別のリクエスト数レポートを作りたい場合は、analogコマンド実行時ににその日ごの対象期間を指定していき、個別にレポートを作るしかないようです。


また、設定ファイルにて「REQARGSFLOOR」のオプションを指定しておかないと、パラメータが違うリクエストは表示されません

デフォルトでは20リクエスト以上のものだけ表示するようになっていますので、細かくリクエストを解析したい場合は、「1r」を指定して最低1リクエスト以上のものを表示するようにしておくと良いでしょう。


簡単ですが、Analogから出力されるレポートを見ていきました。

個人で使う分には、これだけでも十分かもしれません。

ただ、他のアクセス解析サービスなどと比べるとUIが貧弱だったり、これをそのままエンジニアでもない人に見てくださいというのは少し難しかったりします。


ですので、Analogをあくまでアクセス解析エンジンとだけ利用し、結果の数値を加工してオリジナルのアクセスログ解析が作れるようにしてみたいと思います。



Analogの解析結果の出力形式を変更する


Analogの解析結果の出力形式はHTMLファイルだけではありません。

下記の2つのディレクティブを追加することで、異なる形式に出力することができます。


OUTPUT COMPUTER
COMPSEP ,

2番目に指定しているCOMPSEPディレクティブはデータの区切りを指定しています。

上記の場合は、CSV形式となります。

「\t」を指定すればTSV形式となります。


先ほど作成した設定ファイルのままでは、日別レポートとリクエストレポートの2つを出力するようにしていますが、1つのCSVファイルなどにまとめると、その後に加工することが難しくなるため、設定ファイルを分けて何れか一方のデータのみを取り出すようにした方が良いでしょう。

(DAILYREPまたはREQUESTディレクティブの一方をOFFにする)


上記の変更に伴い、analogコマンドの実行オプションも多少変更します。

# /usr/local/src/analog-6.0/analog +F090701:0000 +T090731:2359 +g/home/work/org-analog.cfg +O./analog-daily.csv


これによって出来上がった日別のアクセスログ解析結果は下記のようになります。


x,VE,analog 6.0
x,HN,[my organisation]
x,PS,2009,07,21,14,31
x,FR,2009,07,21,12,52
x,LR,2009,07,21,13,52
x,SR,239
x,PR,43
x,FL,125
x,NF,31
x,NH,1
x,BT,484365
D,RP,239,43,2009,07,21
D,*BT,P,43,2009,07,21


1番目の列が「x」で始まるところは全体の概要を伝える部分なので無視してかまいません。

日別のリクエスト数のデータは、1番目の列が「D」で始まり、2番目の列が「RP」となっている行です。

上記の場合は、239という数字がリクエスト数です。

ちなみにその次の43と言う数値は、ページ単位でのリクエスト数となっています。


では、もう一方のリクエスト別のCSVファイルも作成してみましょう。

結果は、下記のように出力されます。


x,VE,analog 6.0
x,HN,[my organisation]
x,PS,2009,07,21,14,36
x,FR,2009,07,21,12,52
x,LR,2009,07,21,13,52
x,SR,239
x,PR,43
x,FL,125
x,NF,31
x,NH,1
x,BT,484365
r,*f,1R,r
r,lR,1,15,/analog/analog.html
r,lR,1,10,/analog.html
r,lR,1,8,/src/hoge.php
r,lR,1,4,/test.html
r,lR,1,1,/src/formtest.html


こちらも1列目が「x」のところは全体概要のところで、データとして注目するのは、1列目が「r」で2列目が「1R」となっている行です。


HTML以外に様々な形式でアクセスログを解析できるので、Analogをあくまで解析エンジンとだけ動作させ、結果を加工して別の形式で出力させるなどといった柔軟性があります。

ここAmebloのアクセスログ解析も、Analogを使っていると聞いたこともありますし。


もちろんこういったアクセスログ解析は自前で作ることもできますが、せっかくですのでこういった機能を利用して楽にオリジナルのアクセスログ解析を作ってみては如何でしょうか。