apache日志分析脚本

2021-05-25 14:25:47 浏览数 (1)

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

0 人点赞