Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Re: squid log analizer   Eugene Grosbein   11 Oct 2007 16:16:49 
Архивное /ru.unix.bsd/2609317160009.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional