|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Eugene Grosbein 2:5006/1 11 Oct 2007 16:16:49 To : Alexander Chernyh Subject : Re: squid log analizer -------------------------------------------------------------------------------- 10 окт 2007, среда, в 20:00 KRAST, Alexander Chernyh написал(а): >> У меня есть перловый конвертер собственного сочинения, AC> дайте скачать :-) Оно не в очень-то экспортируемом виде :-) Hу вот кусочек, логика вся в нём. А результат всё равно переделывать под себя. sub squidstat($) { my $fname = shift; # Открыть log-файл squid'а printf STDERR "$0: processing PROXY statistics $fname\n"; open(File, $fname) || die "ERROR -- Can't open file $fname\n"; my ($Date,$client,$nbytes,$method,$URL,$hcode,$server); my ($result,$http_code,$ptime,$cached); my ($src,$dst,$dstcat,$srccat,$name,$peer,$ip,$category); my %peername; while(<File>) { chomp; unless (/^(\d{9,})\.\d{3} +(\-?\d+) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (\S+)\/(\d{3}) (\d+) (\S+) (.+) \S+ (TIMEOUT_)?(\S+)\/(\S+) /) { print STDERR "$0: ERROR: $fname: wrong line $.:\n$_\n"; next; } $nbytes = $6; next if $nbytes == 0; $Date = time2str("%Y-%m-%d %H:%M:%S",$1); $ptime = $2; $ptime=0 if ($ptime<0); $client = $3; $result = $4; $http_code = $5; $method = $7; $URL = $8; $hcode = $10; $server = $11; $client =~ s/\.0+(\d)/.$1/; $category = ''; $cached = 0; if ($result =~ /^TCP_(.*)?HIT$/) { # объект отдан из кеша $src = $cache_ip; $dst = $client; $category = 'il'; # input from cache $cached = 1; } elsif($result =~ /^TCP_(.*)MISS$/) { # объекта в кеше не было и он выкачан с исходного сервера if($hcode=~/^(NO_PARENT_|CLOSEST_)?DIRECT$/ || $hcode eq 'SOURCE_FASTEST') { if($server=~/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/) { $src = $server; $dst = $client; } else { # print STDERR "skipped: $server\n"; next; } } elsif($hcode eq 'NO_DIRECT_FAIL') { # объект был запрещен к выкачиванию напрямую конфигурацией # (напр., never_direct) и parent'ы недоступны - не выкачан, # возвращена ошибка $src = $cache_ip; $dst = $client; $category = 'il'; # input error occured } elsif($hcode=~/(SIBLING|PARENT|CARP)/) { # объекта в кеше не было и он выкачан с другого прокси unless (defined($src=$peername{$server})) { # ищем IP прокси unless (defined($peer = scalar gethostbyname($server))) { print STDERR "$0: ERROR: $fname: cannot resolve IP of peer '$server' in line $.:\n$_\n"; next; } $src = $peername{$server} = inet_ntoa($peer); } $dst = $client; } elsif($hcode eq 'NONE') { next; # if($http_code =~ /^5/) { # # произошла ошибка при выполнении запроса # $src = $cache_ip; # $dst = $client; # $category = 'il'; # input error occured # } # else { # print STDERR "$0: ERROR: $fname: $result($hcode) unparsed in line $.:\n$_\n"; # next; # } } else { print STDERR "$0: ERROR: $fname: $result($hcode) unparsed in line $.:\n$_\n"; next; } } elsif($result =~ /^(TCP|UDP)_DENIED$/ || # доступ запрещен $result eq 'UDP_INVALID' || # неверный запрос ICP $result eq 'UDP_MISS_NOFETCH' || # кеш занят - перестраивается $result eq 'UDP_MISS' || # ICP-запрос - нет в кеше $result eq 'UDP_HIT' || # ICP-запрос - есть в кеше $result eq 'UDP_DENIED' || # ICP-запрос от непонятно кого $result eq 'NONE' # другая ошибка или запрос # к cachemgr ) { $src = $cache_ip; $dst = $client; $category = 'il'; # input error occured } else { print STDERR "$0: ERROR: $fname: '$result' unparsed in line $.:\n$_\n"; next; } foreach $ip ($src,$dst) { unless(exists ($category{$ip})) { $category{$ip} = GetCategory($ip,\$name); # вычисление категорий $ipname{$ip} = $name; # и имен машин }} $srccat = $category{$src}; $dstcat = $category{$dst}; $name = $ipname{$dst}; # объект получен от пира if (exists $cache_peer{$src}) { # если объект запрошен нами (cache digest etc.), # ставим одну категорию (например, 'il'), иначе другую (обычно 'if') $category = ( $dst eq $cache_peer{$src}[0] ? $cache_peer{$src}[1] : $cache_peer{$src}[2] ); } # пир получил объект от нас elsif (exists $cache_peer{$dst}) { $category = 'il'; # XXX } elsif ($dstcat == 0) { $category = 'i' . $catname{$srccat} unless $category; } # elsif ($srccat == 0) { # $name = $ipname{$src}; # $category = 'i' . $catname{$srccat} unless $category; # } else { print STDERR "$0: ERROR: $fname: TRANSIT in line $.:\n$_\n"; next; } $src = unpack("N",inet_aton($src)); $dst = unpack("N",inet_aton($dst)); printf "%s\t%s\t%u\t%u\t%03u\t%u\t%s\t%s\t%s\t%s\t%s\t%s\n", $src, $dst, $nbytes, $ptime, $http_code, $cached, $Date, $name, $hcode, $category, $method, $URL; } close(File); } Eugene -- Three things are certain: Death, taxes and lost data. Guess which has occurred. --- slrn/0.9.8.1 (FreeBSD) * Origin: Svyaz Service JSC (2:5006/1@fidonet) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/2609317160009.html, оценка из 5, голосов 10
|