こちらの質問で、ログを収集するのはできるようになりました。
http://q.hatena.ne.jp/1178617727
今度はlogファイルを自動分析する仕組みを作りたいです。
logファイルにカンマ区切りで以下のように保存します。
ホスト,時刻,アクセスURL[改行]
このログファイルから、アクセス数が多いURLを順番に並べるにはどのような処理をすればいいでしょうか?
何からどう手をつけていいのかわかりません。MySQLにデータを格納すれば自力で出来るとは思いますけど、一般的にはどのような処理をするのでしょうか?
漠然とした質問ですが、みなさんよろしくお願いします。
*PHPとMySQLが少々出来るレベルです。
一般的かどうかは分かりませんが、
// $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 に保存するのならそれでいいと思いますが。
自分が同じようなことをやる場合、一旦ファイルに落とさずにアクセスの度に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参考になれば幸いです。
回答ありがとうございます。
後々参考にさせてもらうと思います。
丁寧にありがとうございました!
ありがとうございます。具体的で本当に助かります。
生ログをそのままMySQLに入れてしまうとデータ量が大きくなりすぎて、後々面倒な事になりそうなんです。
SNSを運営しているのですが、生ログに該当する「あしあと」のデータが巨大になりすぎていつも困っています。こんなデータ必要ないだろうと軽い気持ちで削除したらユーザーから苦情が来まして。
PHP側で生ログを加工してMySQLに渡す方法を模索しています。1週間分のログを貯めて、そこからいらないデータは捨てて、加工して、DBに引き渡すといった感じです。
技術が無いために遠回りしているような気もするのですが、現状このくらいしかできません。
とりあえず頂いた回答で試行錯誤してみます。具体的な情報ありがとうございました!