忍者ブログ
読書の記録がメイン。後は、つぶやき的な記録。
214. 213. 212. 211. 210. 209. 208. 207. 206. 205. 204.
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

仕事でaccess.logの分析を急いでする必要があった。
フリーのanalogを使っているんだけど、ちょっと変わった分析をやりたくて。変わった分析をやるには、市販されているソフトもあるんだけど、予算も無いし、時間もないしで手作りというわけ。

access.logをmysqlのテーブルに格納するphpプログラム。
スピードは遅いけど、それなりに動く。強引な処理もあるけど、記録として残しておこく。

PEAEのDBを使用している。
ここから。



// PEAR::DBのインクルード(sql.phpに定義)
include_once "sql.php";

// ファイルを読み込み専用でオープンする
$fp = fopen("./access.log", "r");

// Combined形式のログフォーマット正規表現
$preg_log_format = "/^(.*) (.*) (.*) [(.*)] "(.*)" (.*) (.*) "(.*)" "(.*)"/";

// 除外する拡張子
$ex_word = "/styles.*.css|cgi-bin|.jpg|.JPG|.GIF|.gif|.ico|mt.js/";


while (!feof($fp)) {
// ファイルから一行読み込む
$line = fgets($fp);

//正規表現で配列に各要素を格納する
if (preg_match($preg_log_format, $line, $log)){

$log[4] = cnvdate($log[4]);
if ( !preg_match ($ex_word, $log[5])){

// sqlの定義
$sql=<< insert into t_log(ip,user1,user2,time,request,status,byte,referer,agent)
values
('$log[1]',
'$log[2]',
'$log[3]',
'$log[4]',
'$log[5]',
'$log[6]',
'$log[7]',
'$log[8]',
'$log[9]'
)
EOS;
// SQL文を発行
$result = $conn->query($sql);
if (DB::isError($result)) {
die ($result->getMessage());
}
}

}
}

$count = $conn->affectedRows();
print "データを" . $count . "件、更新しました。";

// データベースから切断
$conn->disconnect();

// ファイルをクローズする
fclose($fp);


//- 関数 ---------------------------------------
// "DD/Mon/YYYY" の日付を "YYYYMMDD" に変換
function cnvdate($cnv){

$preg_date_format = "/^(.*)/(.*)/(.*):(.*):(.*):(.*)/";

if (preg_match($preg_date_format,$cnv, $mysql_time_stamp)){
print "a";
switch($mysql_time_stamp[2]){
case "Jan": $mysql_time_stamp[2] = "01"; break;
case "Feb": $mysql_time_stamp[2] = "02"; break;
case "Mar": $mysql_time_stamp[2] = "03"; break;
case "Apr": $mysql_time_stamp[2] = "04"; break;
case "May": $mysql_time_stamp[2] = "05"; break;
case "Jun": $mysql_time_stamp[2] = "06"; break;
case "Jul": $mysql_time_stamp[2] = "07"; break;
case "Aug": $mysql_time_stamp[2] = "08"; break;
case "Sep": $mysql_time_stamp[2] = "09"; break;
case "Oct": $mysql_time_stamp[2] = "10"; break;
case "Nov": $mysql_time_stamp[2] = "11"; break;
case "Dec": $mysql_time_stamp[2] = "12"; break;
default: $mysql_time_stamp[2] = "99";
}
}

return $mysql_time_stamp[3]."/".$mysql_time_stamp[2]."/".$mysql_time_stamp[1].":".$mysql_time_stamp[4].":".$mysql_time_stamp[5].":".$mysql_time_stamp[6];


}

?>
PR
この記事にコメントする
NAME : 
TITLE : 
COLOR : 
MAIL ADDRESS : 
URL : 
COMMENT : 
PASSWORD : 
この記事へのトラックバック
この記事にトラックバックする:
カレンダー
09 2024/10 11
S M T W T F S
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
最新コメント
プロフィール
HN:
てつ
性別:
男性
ブログ内検索
忍者ブログ | [PR]
shinobi.jp