IIS日志分析系统项目
一、 概述
近期单位上级要求能够每天分析论坛服务器上的iis日志,但本身论坛软件没有能够分析iis日志的程序,鉴于此只有自己开发。在浏览器上看了很多这方面的文章,在iis日志分析这方面主要有两个方向:1、独立日志分析软件:市面上贩售的日志分析软件,早已把大家需要的数据都进行了分析,你只要运行这个软件就可以了,但这有个缺点就是你要购买该软件。2、结合系统的半独立日志分析软件:在分析iis日志方面主要有软件awstats和log parser,先前我从awstats这个方向走的,发现一个问题,就是awstats要分析的iis日志是有固定选项的,但我们一般的iis日志是默认的选项,比awstats要求的选项要多,这样的话,如果我想分析论坛安装awstats前的日志就很麻烦,我曾经请教过一个网上对awstats比较了解的大侠,也对我表示如果分析跟awstats固定选项不同的日志的方法他也不是很清楚,但是有,不过要研究awstats的英文文档。为此,我就放弃awstats这个方向。最终在走log parser这条道上,我走通了。
二、 log parser
log parser是微软自己开发的日志分析软件,免费而且很小巧很强大,它可以结合系统自动分析日志,不仅仅是分析iis日志,系统上的日志都可以分析。它还有其它好处,例如可以用sql语句分析,可以把分析的数据放入数据库,运行的时候占用的资源也不是很多。但这些自动的功能需要自己动手去写些小的命令来执行,所以我叫它半独立的日志分析软件。它可走的方向很多,但要走你需要的方向,就需要你自己去把它整理结合好。以下就是我希望log parser走的方向。
三、 系统设计
1、设计目标:获得每天有多少不同的ip点击过我们的论坛,获得论坛每天的页面点击量。
2、设计思路:获得上面这两个数据分三步走
A、设计批处理程序让log parser每天固定的时候分析iis日志
B、 把iis日志分析的结果放入一个可读的文件里
C、用php程序去读这个可读的文件
下面就是走向图,定时bat命令是起点,html程序是终点。
iis日志文件 |
Log parser |
定时Bat命令 |
结果的Txt文档 |
Php文件 |
Htm程序 |
3、详细步骤:
A、 下载log parser2.2安装到windows2003上,最好下msi格式的,都是免费的。
B、 写bat命令
Log.bat
@echo off
set TodayYear=%date:~0,4%
set TodayMon=%date:~5,2%
set TodayDay=%date:~8,2%
set LastdayYear=
set LastdayMon=
set LastdayDay=
set LastdayYear=%TodayYear%
set LastdayMon=%TodayMon%
set /A LastdayDay=TodayDay-1
if "%LastdayDay%" == "0" (
if "!LastdayMon!" == "01" (
set LastdayMon=12
set /A LastdayYear-=1
) else (
set /A LastdayMon-=1
if "!LastdayMon!" == "1" set LastdayMon=01
if "!LastdayMon!" == "2" set LastdayMon=02
if "!LastdayMon!" == "3" set LastdayMon=03
if "!LastdayMon!" == "4" set LastdayMon=04
if "!LastdayMon!" == "5" set LastdayMon=05
if "!LastdayMon!" == "6" set LastdayMon=06
if "!LastdayMon!" == "7" set LastdayMon=07
if "!LastdayMon!" == "8" set LastdayMon=08
if "!LastdayMon!" == "9" set LastdayMon=09
)
if "!LastdayMon!" == "01" set LastdayDay=31
if "!LastdayMon!" == "03" set LastdayDay=31
if "!LastdayMon!" == "04" set LastdayDay=30
if "!LastdayMon!" == "05" set LastdayDay=31
if "!LastdayMon!" == "06" set LastdayDay=30
if "!LastdayMon!" == "07" set LastdayDay=31
if "!LastdayMon!" == "08" set LastdayDay=31
if "!LastdayMon!" == "09" set LastdayDay=30
if "!LastdayMon!" == "10" set LastdayDay=31
if "!LastdayMon!" == "11" set LastdayDay=30
if "!LastdayMon!" == "12" set LastdayDay=31
if "!LastdayMon!" == "02" (
set IsLeapYear=
set /A IsLeapYear=!LastdayYear!%%400
if "!IsLeapYear!" == "0" (
set LastdayDay=29
goto MAKELASTDATE
)
set /A IsLeapYear=!LastdayYear!%%100
if "!IsLeapYear!" == "0" (
set LastdayDay=28
goto MAKELASTDATE
)
set /A IsLeapYear=!LastdayYear%%4
if "!IsLeapYear!" == "0" (
set LastdayDay=29
goto MAKELASTDATE
) else (
set LastdayDay=28
goto MAKELASTDATE
)
)
)
:MAKELASTDATE
if "%LastdayDay%" == "1" set LastdayDay=01
if "%LastdayDay%" == "2" set LastdayDay=02
if "%LastdayDay%" == "3" set LastdayDay=03
if "%LastdayDay%" == "4" set LastdayDay=04
if "%LastdayDay%" == "5" set LastdayDay=05
if "%LastdayDay%" == "6" set LastdayDay=06
if "%LastdayDay%" == "7" set LastdayDay=07
if "%LastdayDay%" == "8" set LastdayDay=08
if "%LastdayDay%" == "9" set LastdayDay=09
set LastdayYear=%LastdayYear:~2,2%
set LastDate=%LastdayYear%%LastdayMon%%LastdayDay%
path c:/program Files/Log Parser 2.2
logparser "select count(distinct c-ip) as c-ip-hits into 'D:/ logfenxi/%LastdayYear%%LastdayMon%/ip%LastDate%.txt' from 'D:/ex%LastDate%.log'" -o:nat
logparser "select count(*) as cs-uri-stem-hits into 'D:/ logfenxi/%LastdayYear%%LastdayMon%/cs%LastDate%.txt' from 'D:/ex%LastDate%.log' where cs-uri-stem like '%%php'" -o:nat
写此程序的注意事项:1、我写的这个bat命令是分析前一天的日志,所以在日期上要写那么一大段,因为要考虑到闰月和每月的天数不同,也有简单的写法网上有,这段日期的写法也是我从网上找来的2、select语句,这个很重要,你要获得的数据都在select语句上了,如果你想要其它的数据就可以写其它的sql语句,而且注意like这个词,如果我们模糊查询不都是写 like ‘%php’的吗?但在bat命令里你记得要写成’%%php’,如果不这样你的select语句会出错,会没有like后面的东西。
We.Htm
<table width="75%" border="1">
<tr>
<td rowspan="3">2008</td>
<td><a href="du.php?yuefen=0801">01</a></td>
<td><a href="du.php?yuefen=0802">02</a></td>
<td><a href="du.php?yuefen=0803">03</a></td>
<td><a href="du.php?yuefen=0804">04</a></td>
</tr>
<tr>
<td><a href="du.php?yuefen=0805">05</a></td>
<td><a href="du.php?yuefen=0806">06</a></td>
<td><a href="du.php?yuefen=0807">07</a></td>
<td><a href="du.php?yuefen=0808">08</a></td>
</tr>
<tr>
<td><a href="du.php?yuefen=0809">09</a></td>
<td><a href="du.php?yuefen=0810">10</a></td>
<td><a href="du.php?yuefen=0811">11</a></td>
<td><a href="du.php?yuefen=0812">12</a></td>
</tr>
<tr>
<td rowspan="3">2009</td>
<td><a href="du.php?yuefen=0901">01</a></td>
<td><a href="du.php?yuefen=0902">02</a></td>
<td><a href="du.php?yuefen=0903">03</a></td>
<td><a href="du.php?yuefen=0904">04</a></td>
</tr>
<tr>
<td><a href="du.php?yuefen=0905">05</a></td>
<td><a href="du.php?yuefen=0906">06</a></td>
<td><a href="du.php?yuefen=0907">07</a></td>
<td><a href="du.php?yuefen=0908">08</a></td>
</tr>
<tr>
<td><a href="du.php?yuefen=0909">09</a></td>
<td><a href="du.php?yuefen=0910">10</a></td>
<td><a href="du.php?yuefen=0911">11</a></td>
<td><a href="du.php?yuefen=0912">12</a></td>
</tr>
<tr>
<td rowspan="3">2010</td>
<td><a href="du.php?yuefen=1001">01</a></td>
<td><a href="du.php?yuefen=1002">02</a></td>
<td><a href="du.php?yuefen=1003">03</a></td>
<td><a href="du.php?yuefen=1004">04</a></td>
</tr>
<tr>
<td><a href="du.php?yuefen=1005">05</a></td>
<td><a href="du.php?yuefen=1006">06</a></td>
<td><a href="du.php?yuefen=1007">07</a></td>
<td><a href="du.php?yuefen=1008">08</a></td>
</tr>
<tr>
<td><a href="du.php?yuefen=1009">09</a></td>
<td><a href="du.php?yuefen=1010">10</a></td>
<td><a href="du.php?yuefen=1011">11</a></td>
<td><a href="du.php?yuefen=1012">12</a></td>
</tr>
<tr>
<td rowspan="3">2011</td>
<td><a href="du.php?yuefen=1101">01</a></td>
<td><a href="du.php?yuefen=1102">02</a></td>
<td><a href="du.php?yuefen=1103">03</a></td>
<td><a href="du.php?yuefen=1104">04</a></td>
</tr>
<tr>
<td><a href="du.php?yuefen=1105">05</a></td>
<td><a href="du.php?yuefen=1106">06</a></td>
<td><a href="du.php?yuefen=1107">07</a></td>
<td><a href="du.php?yuefen=1108">08</a></td>
</tr>
<tr>
<td><a href="du.php?yuefen=1109">09</a></td>
<td><a href="du.php?yuefen=1110">10</a></td>
<td><a href="du.php?yuefen=1111">11</a></td>
<td><a href="du.php?yuefen=1112">12</a></td>
</tr>
</table>
du.php
<?php
$yuefen = $_GET['yuefen'];
$map="D:/ logfenxi/".$yuefen;
echo "<table cellspacing='1' cellpadding='1' width='100%' border='1'>";
for($i=1;$i<32;$i++)
{
if($i<10)
{
$i="0".$i;
}
$riqi=$yuefen.$i;
$ipriqi=$map."/ip".$riqi;
$csriqi=$map."/cs".$riqi;
$ipfile=$ipriqi.".txt";
$csfile=$csriqi.".txt";
if (file_exists($ipfile) && is_readable ($ipfile))
{
$fp1=fopen($ipfile,"rb");
$fp2=fopen($csfile,"rb");
$content1=fread($fp1,filesize($ipfile));
$content2=fread($fp2,filesize($csfile));
echo "<tr><td>$riqi</td><td>$content1</td><td>$content2</td></tr>";
fclose($fp1);
fclose($fp2);
}
}
echo "</table>";
?>
在服务器上设置任务计划,到“开始”的“附件”的“系统工具”的“任务计划”里添加,让bat命令每天执行。
四、 总结
总算写完了,其实这里面还有很多东西需要说明,因为我在设计这个东西的时候遇到很多的问题,例如:bat命令怎么写,文件夹要怎么设置才最简单明了,如何给别人很清晰的东西(所以我写了we.htm这个文件,这样我就不用我自己把我看到的数据告诉编辑了,编辑们自己到网页上看)。其实还有很方便的方法得到我要得到的数据,例如msde数据库,但论坛上本来已经安了mysql数据库,所以不想安其它的数据库了,要不然还要考虑数据库安全的问题,太麻烦了,我就按我的意愿来做了,但如果你们需要的话,可以尝试看看。搞这个系统费了我很长的时间,但总算搞好了,也算聊以安慰了。要谢谢的人很多,很多人把他们的心血和成就免费提够给大家,我从中学到了很多,才把系统做完的,所以感谢这些无私并且有奉献精神的人。
其实在日志分析上还有很多文章可以做,相信网上还有很多的强人,如果你们有需要都可以去研究。希望我的文章对你们有帮助。
啊!在csdn博客上面我也不知道如何加图片,但我相信大家应该能看懂这个流程