金鳞

目标->软件测试架构师

原文出处:http://hi.baidu.com/smallfish_xy/blog/item/2bc4d4232d23e0ac4723e822.html

功能简述

    统计出日志里一个或多个页面总共访问的次数,比如aa.jsp, bb.jsp这样页面分别多少次。

实现简述

    Apache单个日志文件800M。

    最初程序使用Python编写,按行来统计,分别使用in(最慢)和index方法去查找,然后使用了正则匹配,程序运行时间从最初的1分50多秒优化到1分10秒左右,参考了qyb博客中提到的gc.disable(),有了一定的提升,最终还是需要1分左右。

     然后随意用了Perl写了一个,用了最土鳖的<LOG>这样的按行分析,最后正则匹配,然后++,速度竟然在40-50秒之间,惊叹!后来经过shucho指点,在正则部分采用了预编译,效果那是相当惊人!800M文件只用了7秒左右。

程序片段

# --------------------------------------------------------------------
use strict;
use Benchmark;

my $LOG_FILE = '/usr/local/apache/logs/access.log';
# 下面qr部分起了关键作用,预编译了表达式。
my @EXT_LIST = map {qr/$_/} qw{
aaServlet
bbServlet
};
#qr表示建立正则;map映射,功能可以理解为foreach。

my $startime = new Benchmark;
my %result;
map {$result{$_} = 0} @EXT_LIST; #赋初值
open LOG_FILE, $LOG_FILE;
while (<LOG_FILE>){
    foreach my $ext (@EXT_LIST)
        { $result{$ext}++ if $_ =~ /$ext/; }
}
close LOG_FILE;

while (my ($key, $value) = each(%result)){
    $key =~ s/\(\?-xism:(.*?)\)/$1/g;
    print "$key:\t$value\n";
}

printf "** %s\n\n", timestr(timediff(new Benchmark, $startime));
posted on 2009-05-27 15:56 金鳞 阅读(1197) 评论(2)  编辑 收藏 引用 所属分类: perl

评论

# re: 用perl分析apache日志 2009-11-09 14:13 mwm5
摘走。。hoho  回复  更多评论
  

# re: 用perl分析apache日志 2012-11-22 15:28 d
cat /usr/local/apache/logs/access.log |grep -v "aaServlet\|bbServlet"|wc -l
这个更快  回复  更多评论
  

只有注册用户登录后才能发表评论。