OLAPとは

OLAP(Online Analytical Processing)とは、データベース(以下DB)に登録されているデータをある見方(条件)で問い合わせる(抽出)事が出来るシステムのこと事です。
ある部署の人事データがあるとします。この部署を説明するものとして、平均年収や、ボーナスの最高取得額と最低額との差の大きさで抽出すると、その部署の業務成績の評価の厳しさが、また平均勤続年数、部署への配属年数、平均年齢などからは異動状況などが見えてきます。
OLAPとは、このようにデータを多方面から見て分析するためのシステムの事を言います。

アクセスログのOLAPとは

アクセスログは、ApacheなどのWebサーバ記録しているログの事でこのようなフォーマットになっています。IISなどWebサーバの違いや、同じApacheでも設定によって違いはありますが、どのWebサーバのアクセスログも似たような情報が記録されています。
このアクセスログをDB化してしまえば、IPやドメイン(訪問者)から時系列で抽出してどのような順番でどのページを見てくれたかトレースしたり、htmlやpdfなどのファイル(閲覧ページ)をアクセスの多い順に抽出したりと、分析の幅が拡がります。
検索キーワードなども記録されていますのでキーワード分析も可能ですし、 どのページから来たのを表すリファラという情報からは経路分析も出来ます。

アクセスログのDB化

DB化は、先ずアクセスログを1行を1レコードして読み込み項目別に分解します。
下は、前述のフォーマット形式のアクセスログを読み込み、9つの項目に分解してタブ区切りの CSV形式に変換するPerlプログラムです。
例えば、このプログラムをコピー&ペーストしてtest.plというファイル名で保存したとします。 コマンドラインから、『perl test.pl アクセスログファイル名 > test.csv』とすると、 test.csvファイルが作られますので、これをDBの読み込ませればアクセスログのDB化が出来ます。
#引数の有無をチェック
if (@ARGV < 1 ){ print "Error usage:apalog.pl LogFileName\n"; exit;}
#引数(ログファイル)が読み込み可能かチェック
if ( ! -r $ARGV[0] ){ print "Error $ARGV[0] not read\n";exit;}

open(ACCESS_LOG, $ARGV[0]) || die $!;
while () {
#ログファイルを9項目に分解
my ($p1,$p2,$p3,$p4,$p5,$p6,$p7,$p8,$p9)=
/^(.*) (.*) (.*) \[(.*)\] "(.*)" (.*) (.*) "(.*)" "(.*)"/;
#9項目をタブで区切って出力
print "$p1\t$p2\t$p3\t$p4\t$p5\t$p6\t$p7\t$p8\t$p9\n";
}
close(LOGFILE);
__END__
ログの項目分解をしているのは、/^(.*) (.*) (.*) \[(.*)\] "(.*)" (.*) (.*) "(.*)" "(.*)"/;の 部分です。ログ形式によりこの部分を対応させれば多くのログをCSV化出来ると思います。
用途に合わせて少しづつ改良を加えてみて下さい。
WebログOLAPのアクセスログ取込み部も原型は同じようなものです。 これにDBの日付形式や、ドメイン変換、ブラウザ判定、文字コード対応などなど 諸々の機能を付けて700ステップ程度の大きさになっています。
DBに取込みさえ出来てしまえば、あとはDBへの問い合わせ(select文)を駆使だけで、 精度の高い多くのアクセスログ分析が可能になります。

アクセスログ分析のバリエーション

下の図はHPへのアクセス状況のイメージ図です。横が時間軸で矢印は同じIP(ドメイン)からのアクセスを 表しています。閲覧開始を青矢印で終了を赤矢印で表しています。

一般的なアクセスログ解析では、ある一定期間同じIPからのアクセスが無い場合に訪問終了としてカウントしています。代表的なログ解析ソフトのWebAlizerやアーチンでは、 30分をデフォルトとしています。
この開始と終了の判定の差によって、訪問者数/セッションなどの数値に差が出てしまいます。
30分という基準は、販売サイトなどでは長すぎるかも知れませんし、 pdfなどで学術論文などを提供しているようなサイトでは短すぎるかも知れません。
WebログOLAPの訪問者分析(トレース)では、この時間間隔を動的に変更出来ます。

ログの中から適当にIPを選び出してサンプリングとし、 次のようなselect文を何回か試してみると全体傾向が掴めます。
select * from アクセスログテーブル where IP = 適当に選び出したIP order by アクセス時間
このselect文の出力には、そのIPのアクセス記録が全て表示されます。
この出力には、何処のサイトから来たか、どんなキーワードで来たか、どのページにどのぐらいの時間滞在したか、どんな順序で閲覧したか、一番最初に訪問した日時や最後の訪問の日時、訪問頻度、など一般のアクセスログ解析では得難い情報が多く含まれています。
開始から次の閲覧時間まで一定時間以上開いている場は、直帰として扱えますし、 それがどのページだったかなども判ります。

group byなどのselect文のオプションを利用すると、アクセス回数の上位者のみや、問い合わせなどの特定のページのアクセスのみ、キャンペーンなどの特定の期間のみの抽出も可能になります。

WebログOLAP

WebログOLAPの原理は、アクセスログ分析のバリエーションで紹介したようなことをプログラム的に行っているもので、 ロボットのアクセスをノイズとして除外する為の工夫や、使い易さを求めた追加機能などがありますが、その中心がDBである事に変わりはありません。
アクセスログに限らずデータをDB化すると、データ俯瞰やデータクリーニングなど、 分析前に必要な準備も出来ますし、分析のバリエーションも増やしていけます。

アクセスログのselect実例

アクセスログをそのままDB化してselect文を用いて抽出すると、例えば下の表のような結果を得られます。
ページアクセス日時リクエストリファラ
2009-05-27 08:19:25/トップページ.htmlhttp://www.booble.co.jp&q=トップ
×2009-05-27 08:19:25/css/スタイルシート.css-
×2009-05-27 08:19:25/js/ジャバスクリプト.js-
×2009-05-27 08:19:25/img/バナー01.png-
×2009-05-27 08:19:25/img/バナー02.png-
×2009-05-27 08:19:25/ico/アイコン01.gif-
×2009-05-27 08:19:25/ico/アイコン02.gif-
×2009-05-27 08:19:25/ico/アイコン03.gif-
2009-05-27 08:19:32/会社案内.html/トップページ.html
×2009-05-27 08:19:32/css/スタイルシート.css-
×2009-05-27 08:19:32/js/ジャバスクリプト.js-
×2009-05-27 08:19:32/img/会社案内01.png-
×2009-05-27 08:19:32/img/会社案内02.png-
×2009-05-27 08:19:32/ico/アイコン01.gif-
×2009-05-27 08:19:32/ico/アイコン02.gif-
×2009-05-27 08:19:32/ico/アイコン03.gif-
2009-05-27 08:19:34/会社パンフレット.pdf/会社案内.html
イメージなどのファイルもアクセスログに記録されていますが、 ページとして扱えるのは○の箇所だけです。
ページを構成する大きな単位はhtmlというファイルですが、 サイトの作りによっては、pdf,doc,xls,txtなどがページを構成している場合もありますので、 PVなどの値を算出する場合や閲覧順序などを正しく把握する場合には、 何をページとして扱うかを決めておく、もしくは知っておかなけらばなりません。
表の○×はアクセスログをDB化する時にフラグとして設けた場合にselect文で得られますが、 これららのデータはページデータの何倍、何十倍にもなりますので、通常はDB化せず除外してしまいます。
また、この閲覧者の場合は、boobleから「トップ」というキーワードで訪問して、 「トップページ」-「会社案内」-「会社パンフレット」の3ページを閲覧した事が分ります。
トップページへのアクセス時間は08:19:25で、会社案内へのアクセス時間は08:19:32なので、 トップページには7秒滞在しています。会社案内のページには2秒滞在していて会社パンフレットは、 終了ページになっています。

検索エンジンやリンクサイトなど、どこから訪問してもらえているか、訪問の多い順に抽出したい場合のselect例は、 select リファラ、count(リファラ) from アクセスログテーブル group by リファラ order by count(リファラ)descのようになります。
リファラの項目は、そのままDB化するとパラメータも一緒になってしまいますので、 WebログOLAPでは、urlとパラメータ(キーワード)を分けています。 どのページにアクセスされたかが記録されるリクエストも、url部分だけを抜き出してDB化しています。

pdfなどでファイルが大きな時、一度のアクセスで表示しきれずに、 何度かに分割されます。この場合は、アクセスログに同じpdfファイルへのアクセスが 連続されます。 このようなケースが多いサイトでは、同じページへアクセスが連続した場合は、 一ページとして数えるなどの工夫が必要になります。
またプログラム的にページを生成している場合は、同じhtmlへのアクセスでもパラメータによって 違う内容のページになります。

アクセスログの解析結果を正しく判断する為にも、 ログの内容は一度覗いて把握しておいても無駄にはなりません。

その他のログ管理 OLAP

アクセスログ、データベースのエラーログ、システム、ネットワーク等々、 内部統制なども関連して多くのログを管理する必要性が高まっています。
記録として残すだけでなく、キャパシティやサービスレベルの管理などにもログは 無くてはならないものです。これらのログも1行1レコード形式のものが多くありますので、 DB化すると利便性が非常に高まります。
ログを俯瞰してシステムの全体状況を把握する場合には、大きな効果を発揮しますし、 特に障害対応などで、ある時間軸で横断的にログを確認する場合などでは、 見落としなどの人為的ミスの予防にもなります。
ログをDBに取り込み一元管理するだけでプリミティブなログのOLAP環境が出来ますので、 是非お試し下さい。

メインメニュー