Perl分析Apache/Nginx日志 (2009-6-22)
http://www.lazysa.com/2009/05/480.html
功能简述:
统计出日志里一个或多个页面总共访问的次数,比如aa.jsp, bb.jsp这样页面分别多少次。
分析过程:
Apache单个日志文件800M。
最初程序使用Python编写,按行来统计,分别使用in(最慢)和index方法去查找,然后使用了正则匹配,程序运行时间从最初的1分50多秒优化到1分10秒左右,参考了qyb博客中提到的gc.disable(),有了一定的提升,最终还是需要1分左右。
然后随意用了Perl写了一个,用了最土鳖的这样的按行分析,最后正则匹配,然后 ,速度竟然在40-50秒之间,惊叹!后来经过shucho指点,在正则部分采用了预编译,效果那是相当惊人!800M文件只用了7秒左右
CODE:
use strict;
use Benchmark;
my $LOG_FILE = '/usr/local/apache/logs/access.log';
# 下面qr部分起了关键作用,预编译了表达式
my @EXT_LIST = map {qr/$_/} qw{
aaServlet
bbServlet
};
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$valuen";
}
printf "** %snn", timestr(timediff(new Benchmark, $startime));
// 解释
use Cocoa;
use语句告诉Perl在@INC路径寻找文件Cocoa.pm并包含到解析的源文件拷贝中。use语句是使用类必须的
扩展名pm是包的缺省扩展名,意为Perl Module
use strict;
要求变量声明,语法严格要求,变量声明必须用 my
use Benchmark;
计时设备,可测量某一特定的代码块运行的快慢,为开发人员提供准确的读数,以便于进行代码调整
map
遍历
mapBLOCK,LIST
mapEXPR,LIST
@sizes=map{-s$_}@file_names;
-s是个文件测试操作符,它返回某个文件的size。所以上面这句就返回@file_names数组里每个文件的大小,结果也是个数组
qr,qw
参考 perl-语法
$_
参考 perl-变量
$key =~ s/(?-xism:(.*?))/$1/g;
正则 参考 perl-正则
◆ 常用分析web日志的命令 (2009-6-22)
http://www.lazysa.com/2009/05/319.html
获得访问前10位的ip地址
cat access.log|gawk '{print $1}' |sort|uniq -c|sort -nr |head -10
访问次数最多的文件或页面
cat access.log|gawk '{print $11}'|sort|uniq -c|sort -n
通过子域名访问次数,依据referer来计算,稍有不准
cat access.log | awk '{print $11}' | sed -e ' s/http:////' -e ' s//.*//' | sort | uniq -c | sort -rn | head -20
列出传输大小最大的几个文件
cat www.access.log |awk '($7~/.php/){print $10 " " $1 " " $4 " " $7}'|sort -nr|head -100
列出输出大于200000byte(约200kb)的页面以及对应页面发生次数
cat www.access.log |awk '($10 > 200000 && $7~/.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100
如果日志最后一列记录的是页面文件传输时间,则有列出到客户端最耗时的页面
cat www.access.log |awk '($7~/.php/){print $NF " " $1 " " $4 " " $7}'|sort -nr|head -100
列出最最耗时的页面(超过60秒的)的以及对应页面发生次数
cat www.access.log |awk '($NF > 60 && $7~/.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100
列出传输时间超过 30 秒的文件
cat www.access.log |awk '($NF > 30){print $7}'|sort -n|uniq -c|sort -nr|head -20
列出当前服务器每一进程运行的数量,倒序排
ps -ef | awk -F ' ' '{print $8 " " $9}' |sort | uniq -c |sort -nr |head -20