ice024
(ice024)
新手上路

初级会员
UID 20808
精华
0
积分 36
帖子 49
金钱 36 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2003-6-16
状态 离线
|
网站日志分析
今天上网看到一则网上招聘的题目中有关于网站日志分析的题目,由于有时间就弄了个程序,大家给评评!
基本思路:
1、日志文件格式分析
127.0.0.1 - - [15/Nov/2006:22:16:49 +0800] "GET /sqlitemanager/theme/green/pics/browse2.png HTTP/1.1" 304 -
上面的格式可以用正则取出其中的ip,时间,http,状态等数据
2、由于要有汇总数据,一个基本想法是如果用数据库的话将会非常简单。于是想到用SQLite这个数据库,这个数据库可以直接将临时数据库建在内存中。由于只对数据库的操作比较熟悉,不知道是否能够直接用数组进行各种统计和查询。
具体代码见附件,欢迎各种意见!
哦对了,测试的时候将日志文件弄小了,如果太大可能时间会很长!
<?php $file = 'E:/Program Files/wamp/logs/access.log'; /* 判断日志文件是否可读 */ if (!is_readable($file)) { echo '日志文件路径不对,请核对!';die(); } /* 将网站日志文件读到$content数组中 */ $content=file($file); /* 构建$logs数组,为分析做准备 这里是以一条典型记录为模型进行正则分析获得相对应的数据 */ foreach($content as $row){ $pattern="!^(.*?)s-s-s[(.*?)]s\"(.*?)\"s(.*?)s(.*)$!"; preg_match($pattern,$row,$matches); $log['ip']=$matches[1]; $log['date']=$matches[2]; $log['Http']=$matches[3]; $log['status']=$matches[4]; $log['CLF']=$matches[5]; $logs[]=$log; } /* 建立临时数据库存放网站记录数据 */ $db=new SQLiteDatabase(':memory:'); $sql='CREATE TABLE logs ( id INTEGER PRIMARY KEY, ip VARCHAR , date VARCHAR , Http VARCHAR , status VARCHAR , CLF VARCHAR )'; $db->query($sql); /* 将$logs中的数据插入到这个临时数据库中,这里用到了事务,不过因为在内存中,速度影响不大 */ $db->query('BEGIN TRANSACTION '); foreach($logs as $log){ if($log[ip]){//条件判断数组数据是否为空!分析的时候发现最后一行数据是空的! $sql="INSERT INTO logs ( id , ip , date , Http , status , CLF ) VALUES ( NULL , '".$log['ip']."' , '".$log['date']."' , '".$log['Http']."' , '".$log['status']."' , '".$log['CLF']."' ) "; $db->query($sql);} } $db->query('COMMIT TRANSACTION ');
/* 根据建立的数据库进行各种分析 */
/* 网页状态分析 */ $sql='SELECT status,count(id) as count FROM logs GROUP BY status order by count DESC '; $rs=$db->query($sql); $status=$rs->fetchall(SQLITE_ASSOC); /* IP地址来源分析 */ $sql='SELECT ip,count(id) as count FROM logs GROUP BY ip order by count DESC'; $rs=$db->query($sql); $ip=$rs->fetchall(SQLITE_ASSOC); /* 网页访问强度分析 */ $sql='SELECT Http,count(id) as count FROM logs GROUP BY Http Having count>10 order by count DESC '; $rs=$db->query($sql); $Http=$rs->fetchall(SQLITE_ASSOC); /* 时间分析 按天计算 这里建立一个函数,用这个函数在SQLite数据库中对日期进行调整!变为天! */ function mydate($date){ return date('Y-m-d',strtotime($date)); } $db->createFunction('mydate','mydate',1); $sql='SELECT mydate(date) as dday,count(id) as count FROM logs GROUP BY dday Having count>10 order by dday DESC '; $rs=$db->query($sql); $mydate=$rs->fetchall(SQLITE_ASSOC);
/* 将这些结果进行展示,这部分一般可以单独放在一个模板文件中*/ ?> [ 本帖最后由 ice024 于 2006-11-18 04:41 PM 编辑 ]
附件: 您所在的用户组无法下载或查看附件
|
|