「logファイル分析:自作アクセス解析」


こちらの質問で、ログを収集するのはできるようになりました。
http://q.hatena.ne.jp/1178617727

今度はlogファイルを自動分析する仕組みを作りたいです。

logファイルにカンマ区切りで以下のように保存します。

ホスト,時刻,アクセスURL[改行]

このログファイルから、アクセス数が多いURLを順番に並べるにはどのような処理をすればいいでしょうか?

何からどう手をつけていいのかわかりません。MySQLにデータを格納すれば自力で出来るとは思いますけど、一般的にはどのような処理をするのでしょうか?

漠然とした質問ですが、みなさんよろしくお願いします。

*PHPとMySQLが少々出来るレベルです。

回答の条件
  • 1人5回まで
  • 登録:2007/05/09 16:07:40
  • 終了:2007/05/16 15:12:45

回答(2件)

id:GEN111 No.1

GEN111回答回数472ベストアンサー獲得回数582007/05/09 17:12:31

ポイント50pt

一般的かどうかは分かりませんが、

// $log にテキスト形式のログが入っているとして

$logarray = explode("\n", preg_replace('/.*,/', '', trim($log))) ;
// アクセスURLだけの配列を作る

$access = array_count_values($logarray) ; // アクセスURLの数を数える
arsort($access) ; // 多い順にソート

foreach (array_keys($access) as $one) { echo "$one\n" ; } // 表示

アクセスがある度にMySQLに書き込むのは非現実的だと思います。

ログを MySQL に保存するのならそれでいいと思いますが。

id:tokyosmash

ありがとうございます。具体的で本当に助かります。

生ログをそのままMySQLに入れてしまうとデータ量が大きくなりすぎて、後々面倒な事になりそうなんです。

SNSを運営しているのですが、生ログに該当する「あしあと」のデータが巨大になりすぎていつも困っています。こんなデータ必要ないだろうと軽い気持ちで削除したらユーザーから苦情が来まして。



PHP側で生ログを加工してMySQLに渡す方法を模索しています。1週間分のログを貯めて、そこからいらないデータは捨てて、加工して、DBに引き渡すといった感じです。

技術が無いために遠回りしているような気もするのですが、現状このくらいしかできません。

とりあえず頂いた回答で試行錯誤してみます。具体的な情報ありがとうございました!

2007/05/09 17:36:46
id:quinoco No.2

quinoco回答回数18ベストアンサー獲得回数02007/05/10 01:24:34

ポイント50pt

自分が同じようなことをやる場合、一旦ファイルに落とさずにアクセスの度にDBに追加しちゃいますねー。既にアクセスログをファイルに記録してるのであれば、まずそのデータをDBに入れてしまって、それ以降はアクセスの度にDBに書き込むようにしちゃいます。

で、ファイルにアクセスログがある場合、それをDBにまとめて記録する方法はこんな流れになると思います。

$data = file("access.log");

$count = count($data);

// このへんでDBを開く

for($i=0; $i<$count; $i++)

{

$tmp = split(',', trim($data[$i]));

// tmp[0] ホスト

// tmp[1] 時刻

// tmp[2] アクセスURL

// これらを組み合わせてクエリを作る

// クエリ発行

}

// このへんでDBを閉じる

こんな感じです。

MySQLは長らく触っていないので、ミスったら嫌だから処理の手順だけ書いています。すみませんw参考になれば幸いです。

id:tokyosmash

回答ありがとうございます。

後々参考にさせてもらうと思います。

丁寧にありがとうございました!

2007/05/16 15:12:08
  • id:tokyosmash
    質問文でちょっとわかりづらい記述がありました。

    >MySQLにデータを格納すれば自力で出来るとは思いますけど、一>般的にはどのような処理をするのでしょうか?

    これは「MySQLへのデータ格納の方法を教えてください」という意味ではありません。

    MySQLにデータを格納してしまえばSELECT文を使って自力で出来そうですが、アクセスがある度にMySQLに書き込むのは非現実的だと思います。一般的にはどのような処理をするのが現実的でしょうか?

    という意味です。
  • id:quinoco
    複数回書き込むのもアレなのでコメントで。

    取り敢えず回答の趣旨が的外れですみません。
    で、アクセスがある度にMySQLのデータベースに書き込みを行うことが現実的かという点ですが、一般的には問題ないと思います。アクセスカウンタやアクセス解析システムでも、データベースを使用して居るものであれば同じようにアクセスの度にSQLデータベースに書き込みを行っていると思います。

    ファイルベースでそのようなことを行う場合、定期的にログを他に映したり等が必要になるのですが、SQLのようなDBMSの場合、そもそもその手の手間や集計の煩わしさを軽減するために設計されているので、問題ないとおもいます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません