`
isiqi
  • 浏览: 16701515 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

利用apache的日志文件进行网站流量统计zz

阅读更多
http://Tech.acnow.net 2006-10-27 15:39:43 互联网

一、环境:freebsd(linux)+apache+php+mysql



二、概述:对于使用apache作为web服务器的网站来说,apache的access_log是进行流量统计的重要的依据。

根据access_log文件来进行流量统计的方法有两种,一种是直接在程序中对log文件进行分析,这种

方法的一个明显的缺点是速度比较慢,比较耗费资源,因为一个浏览量较高的网站的log文件是非常

大的,一个典型的例子是老外用c写的analog;另一种方法是把每日的log文件记录导入数据库,再

用程序对数据库进行分析,这种方法相对前者来说有比较大的速度和性能上的优势。这里我写的这个
程序的功能虽然不及analog等强大,但是……,自己的东西用的还是比较舒服的,呵呵,不过这只是

我的方法,中间可能会有一些不对的地方,请大家指正。



三、具体实现:主要利用freebsd(linux)的crontab每天自动定时执行程序产生每日的html格式的流量报表文件。



注意:以下命令以apache默认的log文件格式处理,如果你定制了不同的log文件格式,具体命令要根据具体情况修改。

并且要以cgi方式编译一次php,以便以命令行方式运行php程序。



1.your_log数据表结构

根据apache默认的log文件中的子段,可以很容易地设计your_log数据表的结构:

CREATE TABLE your_log (

host varchar(15) NOT NULL,

ident varchar(8) NOT NULL,

auth varchar(20) NOT NULL,

time varchar(24) NOT NULL,

zone varchar(8) NOT NULL,

method varchar(6) NOT NULL,

file varchar(255) NOT NULL,

protocol varchar(10) NOT NULL,

status varchar(5) NOT NULL,

bytes int(10) DEFAULT '0' NOT NULL,

KEY host (host),

KEY file (file),

KEY status (status),

KEY bytes (bytes)

);



2.分离log文件,形成每天一个log文件,以日期为目录,文件名自定(假设是your_log)

考虑这个步骤时,想到过利用linux的logrotate功能和apache自带的rotatelogs功能,但是由于我用的是freebsd,没有找到

logrotate命令,而apache的rotatelogs我用之后没有发现能够指定生成文件名的功能,只能用timestamp作为文件名,对于

程序来说不好处理,所以我自己想了以下的方法,如果有人认为这样不好而能提供更好的方法,请不吝赐教:)

mkdir /your_log_dir/`date -v-1d "+%Y%m%d"` #建立每天的log文件目录

cat /your_apache_log_dir/access_log | grep `date -v-1d "+%d/%b/%Y"` > your_log_dir/`date -v-1d "+%Y%m%d"`/your_log

将此二命令放入crontab,我设为每天凌晨1点自动运行(时间可自己定,但是一定要在0点以后)。



3.将日报文件导入数据库

/your_mysql_bin_dir/mysqlimport -u mysql_username -p mysql_password -d --fields-terminated-by=' ' your_db_name your_log_dir/`date -v-1d "+%Y%m%d"`/your_log

这个命令先将your_db_name数据库中的your_log数据表清空,再从已生成的your_log文本文件里导入数据,以空格为字段分界。

将此命令放入crontab,我设为每天凌晨1:30自动运行(时间可自己定,但是一定要在执行第2步以后,先后顺序不能颠倒)。





4.生成每日流量统计日报html文件的php程序

a.假设网站的document_root下有以下四个子目录(栏目):aaa,bbb,ccc,ddd,如有更多,依此类推;

b.这里只在日报页面上计算以下几个统计数字:数据总流量、总请求次数、访问主机数、总pageview数量、

各个栏目之pageview数量、每小时的pageview数量;

c.根据RFC2616标准,请求状态编码中以4和5开头的均为错误或无效请求,在统计时应过滤掉这些数字;

d.这里我假设整个网站以php构建,计算流量时只考虑*.php和*.html文件以及纯目录请求的次数。

e.可以根据个人的需要增加很多统计数字,如工作时间与非工作时间的流量等等,这里就不赘述了,请大家自己考虑吧:)



[dreport.php代码文件]

<?php

//--连接数据库--

$db=@mysql_connect("localhost","user","password") or die(mysql_error());

@mysql_select_db("your_db_name",$db) or die(mysql_error());



//--取前一天的timestamp--

$yestoday_array=getdate(time()-24*60*60);

$start_time=mktime(0,0,0,$yestoday_array["mon"],$yestoday_array["mday"],$yestoday_array["year"]);

$end_time=mktime(23,59,59,$yestoday_array["mon"],$yestoday_array["mday"],$yestoday_array["year"]);


//--计算总数据流量--

$bytes=0;

$sql0="select bytes from your_log";

$res0=mysql_query($sql0) or die(mysql_error());

while($row0=@mysql_fetch_row($res0)){

$bytes+=$row0[0];

}



//--计算总请求次数--

$sql1="select count(host) from your_log";

$res1=mysql_query($sql1) or die(mysql_error());

$row1=@mysql_fetch_row($res1);

$hits=$row1[0];



//--计算访问主机数量--

$sql2="select distinct host from your_log";

$res2=mysql_query($sql2) or die(mysql_error());

$ips=@mysql_num_rows($res2);





//--计算总pageviews--

$sql4="select count(host) from your_log where (file like '%.html%' ";

$sql4.="or file like '%.php%' or file not like '%.%') ";

$sql4.="and left(status,1) <> '4' and left(status,1) <> '5'";

$res4=mysql_query($sql4) or die(mysql_error());

$row4=@mysql_fetch_row($res4);

$pageviews=$row4[0];



//--计算aaa栏目的pageviews--

$sql5="select count(host) from your_log where file like '%/aaa/%' ";

$sql5.="and (file like '%.php%' or file like '%.html%' or file not like '%.%') ";

$sql5.="and left(status,1) <> '4' and left(status,1) <> '5'";

$res5=mysql_query($sql5) or die(mysql_error());

$row5=@mysql_fetch_row($res5);

$aaapvs=$row5[0];



//--计算bbb栏目的pageviews--

$sql6="select count(host) from your_log where file like '%/bbb/%' ";

$sql6.="and (file like '%.php%' or file like '%.html%' or file not like '%.%') ";

$sql6.="and left(status,1) <> '4' and left(status,1) <> '5'";

$res6=mysql_query($sql6) or die(mysql_error());

$row6=@mysql_fetch_row($res6);

$bbbpvs=$row6[0];



//--计算ccc栏目的pageviews--

$sql7="select count(host) from your_log where file like '%/ccc/%' ";

$sql7.="and (file like '%.php%' or file like '%.html%' or file not like '%.%') ";

$sql7.="and left(status,1) <> '4' and left(status,1) <> '5'";

$res7=mysql_query($sql7) or die(mysql_error());

$row7=@mysql_fetch_row($res7);

$cccpvs=$row7[0];



//--计算ddd栏目的pageviews--

$sql8="select count(host) from your_log where file like '%/ddd/%' ";

$sql8.="and (file like '%.php%' or file like '%.html%' or file not like '%.%') ";

$sql8.="and left(status,1) <> '4' and left(status,1) <> '5'";

$res8=mysql_query($sql8) or die(mysql_error());

$row8=@mysql_fetch_row($res8);

$dddpvs=$row8[0];



//--计算首页的pageviews--

$sqlg="select count(host) from your_log where (file = '/' or file = '/index.html') ";

$sqlg.="and left(status,1) <> '4' and left(status,1) <> '5'";

$resg=mysql_query($sqlg) or die(mysql_error());

$rowg=@mysql_fetch_row($resg);

$indexpvs=$rowg[0];



//--report是生成日报文件的字符串--

$report="<HTML>n";

$report.="<HEAD>n";

$report.="<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">n";

$report.="<TITLE>流量统计日报</TITLE>n";

$report.="</HEAD>n";

$report.="<BODY>n";

$report.="时间:".date("Y-m-d H:i:s",$start_time)." -- ".date("Y-m-d H:i:s",$end_time)."<BR><BR>n";

$report.="<FONT SIZE="+2"><B><I>PageViews:</I></B></FONT>n";

$report.="<P>数据吞吐总量:".$bytes."&nbsp;Bytes<BR>请求次数:".$hits."  IP主机数:<FONT COLOR="green">".$ips."</FONT><BR>n";

$report.=" PageViews:<FONT COLOR="red">".$pageviews."</FONT></P>n";

$report.="<P><FONT FACE="宋体" COLOR="#008000" SIZE="3"><B>各个栏目PageViews:</B></FONT></P>n";

$report.="<TABLE WIDTH="300" BORDER="1">n";

$report.=" <TBODY>n";

$report.=" <TR>n";

$report.=" <TD>/</TD>n";

$report.=" <TD>首页</TD>n";

$report.=" <TD>".$indexpvs."</TD>n";

$report.=" </TR>n";

$report.=" <TR>n";

$report.=" <TD>/aaa/</TD>n";

$report.=" <TD>aaa栏目</TD>n";

$report.=" <TD>".$aaapvs."</TD>n";

$report.=" </TR>n";

$report.=" <TR>n";

$report.=" <TD>/bbb/</TD>n";

$report.=" <TD>bbb栏目</TD>n";

$report.=" <TD>".$bbbpvs."</TD>n";

$report.=" </TR>n";

$report.=" <TR>n";

$report.=" <TD>/ccc/</TD>n";

$report.=" <TD>ccc栏目</TD>n";

$report.=" <TD>".$cccpvs."</TD>n";

$report.=" </TR>n";

$report.=" <TR>n";

$report.=" <TD>/ddd/</TD>n";

$report.=" <TD>ddd栏目</TD>n";

$report.=" <TD>".$dddpvs."</TD>n";

$report.=" </TR>n";

$report.=" <TR>n";

$report.=" <TD> </TD>n";

$report.=" <TD>总数</TD>n";

$report.=" <TD>".$pageviews."</TD>n";

$report.=" </TR>n";

$report.=" </TBODY>n";

$report.="</TABLE>n";

$report.="<P><FONT FACE="宋体" COLOR="#008000" SIZE="3"><B>每小时PageViews:</B></FONT></P>n";

$report.="<TABLE WIDTH="300" BORDER="1">n";

$report.=" <COL WIDTH="439" STYLE="mso-width-source:userset;mso-width-alt:14048;width:329pt">n";

$report.=" <COL WIDTH="120" STYLE="mso-width-source:userset;mso-width-alt:3840;width:90pt">n";

$report.=" <TR HEIGHT="21" STYLE="height:15.75pt">n";

$report.=" <TD HEIGHT="21" CLASS="xl22" WIDTH="200" STYLE="height: 15.75pt">Hour</TD>n";

$report.=" <TD CLASS="xl22" WIDTH="100" HEIGHT="21"><SPAN STYLE="mso-spacerun:yes">&nbsp;</SPAN> Page Views</TD>n";

$report.=" </TR>n";



//--每小时的pageview--

for($i=0;$i<24;$i++){

$date_temp=date("[d/M/Y:",time()-24*60*60).sprintf("d",$i);

$sqlh="select count(host) from your_log where (file like '%.html%' or file like '%.php%' ";

$sqlh.="or file not like '%.%') and time like '$date_temp%' ";

$sqlh.="and left(status,1) <> '4' and left(status,1) <> '5'";

$resh=mysql_query($sqlh) or die(mysql_error());




$rowh=@mysql_fetch_row($resh);

$report.=" <TR HEIGHT="19" STYLE="height:14.25pt">n";

$report.=" <TD HEIGHT="19" CLASS="xl23" STYLE="height: 14.25pt" WIDTH="200">".sprintf("d",$i).":00 - ".sprintf("d",$i).":59</TD>n";

$report.=" <TD CLASS="xl23" x:num WIDTH="100" HEIGHT="19">".$rowh[0]."</TD>n";

$report.=" </TR>n";

}



//--关闭数据库--

mysql_close();



$report.="</TABLE>n";

$report.="</BODY>n";

$report.="</HTML>";



//--生成每天的流量统计html页面文件,以日期为文件名--

$report_file="/your_report_dir/".date("Ymd",time()-24*60*60).".html";

$fp=fopen($report_file,"w");

fwrite($fp,$report);

fclose($fp);

?>



5.每天凌晨执行2、3步后执行此程序,将自动产生前一天的流量统计html页面

/your_php_bin_dir/php /some_dir/dreport.php

将此命令放入crontab,我设为每天凌晨2:00自动运行(时间可自己定,但是一定要在第3步以后,先后顺序不能颠倒)。



四、结束语

终于要写完了,这里还要补充一些东西。对于流量非常大的大型网站,可能并不适合把以上的步骤都放在web服务器上

自动定时运行,因为可能会对服务器造成比较大的负荷,所以当遇到这种情况时,也许用php来完成这个任务并不是很好的

选择,可以考虑用效率最高的c/c++来写程序,还有就是可以考虑把apache的日志文件下载到本地的服务器,再用以上方法

来完成任务。还要提醒朋友们,这里主要阐述的是一个解决方案、一种思路,遇到不同的情况时还是要具体问题具体分析

的:),我把它写出来希望能够起到抛砖引玉的作用,期待您的意见与建议!(是不是有人嫌我太罗嗦了?我走……)
分享到:
评论

相关推荐

    apache日志文件说明

    ### Apache日志文件详解 #### 一、引言 在管理Web服务器的过程中,了解服务器的活动情况、性能表现以及可能出现的问题对于确保服务器稳定运行至关重要。Apache HTTP服务器因其强大的功能和灵活性成为了众多网站的...

    如何按日期生成apache日志文件及限制apache日志文件大小

    这对于高流量的网站尤其重要,因为大量日志文件会占用硬盘空间,还可能影响服务器性能。 4. **参考资料**: - 英文文档:http://httpd.apache.org/docs/2.0/programs/rotatelogs.html - 中文文档:...

    Apache日志分析手册

    Apache日志分析手册详细介绍了如何在Linux环境下利用Apache服务器的访问日志来分析和诊断问题。在生产环境中,服务器的运行状况往往可以通过日志文件得到反映,特别是在发现访问量异常、响应缓慢或出现错误信息时。...

    天智Apache日志分析器

    2. 访问统计:提供各种访问统计信息,如总访问次数、独立访客数、页面浏览量等,便于对网站流量进行量化评估。 3. 错误分析:专门针对错误日志进行分析,能快速定位和识别常见的错误类型,如404、500等,减少用户因...

    天智Apache日志查看器 v1.5.zip

    【Apache日志查看器】是针对【WEB服务器】领域的一款实用工具,专为管理和解析Apache服务器产生的日志文件而设计。这款名为“天智Apache日志查看器”的软件版本为v1.5,通过其提供的功能,用户可以高效地监控、查看...

    apache日志切割

    Apache 提供了一种名为 `rotatelogs` 的工具,它是一个与 Apache 一起安装的小型实用程序,可以自动创建和管理日志文件。通过使用 `rotatelogs`,我们可以根据时间间隔(如每日或每小时)来切割日志,从而使得日志...

    APACHE日志分析工具

    很多apache日志分析工具都是要安装到服务器上的,而且安装非常麻烦,于是我写了一个单机版(exe,Windows),方便大家分析apache访问日志,绿色版的,直接解压就可以用。 功能: 1、导入apache访问日志; 2、访问...

    Web应用安全:apache日志配置.pptx

    在kali中,apache的主配置文件是/etc/apache2/apache2.conf,我们在这个文件中进行查找,很容易找到日志配置信息,我们可以修改其中的参数,来对日志配置进行修改,如下图: apache日志配置 在kali,访问日志被记录...

    apache日志分析系统awStats完全教材

    awStats会自动读取Apache生成的日志文件,对其进行分析后生成一系列统计报告。这些报告涵盖了网站流量、用户行为、搜索引擎排名等多个方面,为网站管理者提供了一幅清晰的运营图景。 ##### 2. 报告展示与定制 ...

    apache日志分析系统免费版V1.6

    2. **数据统计**:系统能对访问次数、独立IP数、访问页面数等进行统计,展示网站的整体流量情况。 3. **用户行为分析**:通过分析用户的请求路径,可以发现用户最常访问的页面、停留时间最长的页面,以及页面之间的...

    Apache Web日志Hive实验数据

    总的来说,Apache Web日志Hive实验数据提供了一个理想的平台,让我们能够深入理解如何利用Hive对Web日志进行大数据分析,同时掌握数据仓库和SQL查询的基本技巧。这个实验不仅适用于初学者,也对有经验的数据分析师和...

    查看apache日志

    通过了解`httpd.conf`配置文件中的关键指令,掌握如何查看和分析日志文件,可以帮助我们更好地监控和管理Apache服务器的状态,及时发现并解决问题。此外,合理利用日志管理工具和技术,可以进一步提高运维效率和数据...

    Apache Log的每日一个日志文件及选择性记录设置

    通过对Apache的日志文件进行分隔以及选择性记录,可以有效降低日志文件的大小,提高日志管理的效率。同时,选择性记录还可以帮助我们更好地关注到重要的访问行为,减少不必要的日志数据。在实际应用中,可根据自身...

    debian apache日志服务器配置

    现在,Apache的日志将会被集中到日志服务器上,通过`/var/log/syslog-ng/apache2/access_www.gonline.com.log`文件进行查看和分析。这种配置方式提高了日志管理的效率,方便了对大量服务器的日志监控和维护工作。

    shell 处理apache日志入库

    shell 处理apache日志入库 awk分析apache日志为*.sql文件 sqlplus写入oracle

    lorg, Apache日志文件安全分析器.zip

    lorg, Apache日志文件安全分析器 LORG用于高级日志日志文件安全性分析和取证的工具Web服务器日志文件是重建事件的主要来源,如果网站受到pwned的影响,则会导致事件。 然而,从大型文件中提取相关信息是一项艰巨的...

    apache日志分割

    Apache日志分割是管理和分析大型Web服务器日志文件的一种常见方法。Apache,作为最流行的开源Web服务器,会产生大量的访问日志,这些日志记录了所有客户端请求的详细信息。随着时间的推移,单个日志文件可能会变得...

    Apache错误日志时时查看

    Apache错误日志是调试Web服务器问题的关键工具,它记录了Apache服务器在运行过程中遇到的各种错误和警告信息。...对于经验丰富的开发者,理解如何利用日志进行故障排查和性能优化,将提升其工作效率和服务器管理水平。

    基于hadoop平台的pig语言对apache日志系统的分析

    通过这个项目,我们可以学习如何利用Hadoop和Pig对大规模日志数据进行有效的处理和分析,这对于理解用户行为、优化网站性能、提升服务质量以及网络安全监控具有实际应用价值。同时,这也体现了开源工具在大数据领域...

    Web应用安全:apache日志配置.docx

    Apache是世界上最流行的一款Web服务器软件,它被广泛用于托管各种网站和应用程序。在Web应用安全领域,理解并正确配置Apache日志是至关重要的,因为这些日志提供了关于服务器活动、潜在攻击和性能问题的关键信息。...

Global site tag (gtag.js) - Google Analytics