Re: Statistics & CGPro

От: Roman Prokhorov, Stalker Labs <Roma_at_mx_ru>
Дата: Thu 06 Apr 2000 - 19:25:26 MSD

  Hello,

On Thu, Apr 6, 2000, 12:33:08 GMT Sergey I. Golod wrote:

>Эээ... Оно конечно по snmp можно общую статистику собрать, но меня больше
>интересует следующее:
>===================================================
>Вася Пупкин - 5мб принято/1мб передано
>Коля Плюшкин - 10 мб принято/1кб передано
>===================================================
>статистика по доменам, принято:
>mail.ru - 10mb
>chat.ru - 20 mb
>
>и т.д. и т.п.

Где-то полгода назад я писал Perl-скрипт для анализа логов, который подобную статистику собирает.


#!/usr/bin/perl -w
#
#  A simple CommuniGatePro log analysing script.
#  The log files should be specified as parameters in commnad line. 
#  Make sure you have 'Major & Failures' or lower logging level
#  in Message log, Enqueur, Dequeuer, Local, WebUser, SMTP, and RPOP modules.
#
#  Please send your comments and suggestions to <support@stalker.com>
#

if(@ARGV eq 0) {
  print "Usage: LogAnalyse.pl log_file [log_file2 ...]\n";   exit;
}

my %MsgList;
my %OrphanedList;
my %PerAccountTraffic;

my ($id,$source,$src_oper,$dest,$dst_oper,$time,$size,$inQueue);

while(<>) {
  my $line=$_;
  if(/\[(\d+)\]/) {
    $id=$1;

    if(defined $MsgList{$id}) {
      my $data=$MsgList{$id};
      ($source,$src_oper,$dest,$dst_oper,$time,$size,$inQueue)=@$data;
    } else {
      $source=$src_oper=$dest=$dst_oper=$time=$size='???';$inQueue=0;
    }
    if(/(composed)/ || /(received)/ || /(fed)/ || /(->)/) {
      $source='unknown';
      $src_oper=$1;
      /(\d\d:\d\d:\d\d\.\d\d) /;
      $time=substr($1,0,8);

      if(/(\d+) bytes/) {
        $size=$1;
      }  
      if($src_oper eq 'fed') {
        /is fed as \[(\d+)\]/;
        $id=$1;
      } elsif($src_oper eq '->') {
        / -> \[(\d+)\]/;
        $id=$1;
        $src_oper='rule action';
      }
      if(/ \d RPOP/) {
        $src_oper='RPOP';
      }
      if(/\((.+?)\)/) {
        $source=PurgeName($1);
      }elsif(/(DEQUEUER report)/) {
        $source=$1;
      }
      $MsgList{$id}= [$source,$src_oper,$dest,$dst_oper,$time,$size,$inQueue];
    }elsif(/ QUEUE\(\[/) {
      $inQueue=1;
      if(/(\d+) bytes/) {
        $size=$1;
      }elsif(/ deleted/) {
        delete $MsgList{$id};
        #print "deleted: $id\n";
      }
    }elsif(/ ACCOUNT/) {
      if(/ (delivered)/ || / (relayed)/) {
        $dst_oper=$1;
        /ACCOUNT\((.*)?\)/;
        $dest=PurgeName($1);
        unless($inQueue) {
          if($time ne '???' && $source ne '???') {
            print "$time Src=$source ($src_oper) To=$dest $dst_oper ($size bytes)\n";
            AddToOutput($source) if(isDesired($source));
            AddToInput($dest) if(isDesired($dest));
          } else {
            /(\d\d:\d\d:\d\d\.\d\d) /;
            $time=$1;
            delete $MsgList{$id};
            $OrphanedList{$id}= [$source,$src_oper,$dest,$dst_oper,$time,$size];
          }
          delete $MsgList{$id};
        }
      }
    }elsif(/ DEQUEUER \[/) {
      if(/ (delivered)/ || / (relayed)/) {
        $dst_oper=$1;
        /(\S*\(\S*\)?\S*)/;
        $dest=PurgeName($1);

        if($time ne '???' && $source ne '???') {
          print "$time Src=$source ($src_oper) To=$dest $dst_oper ($size bytes)\n";
          AddToOutput($source) if(isDesired($source));
          AddToInput($dest) if(isDesired($dest));
        } else {
          /(\d\d:\d\d:\d\d\.\d\d) /;
          $time=$1;
          delete $MsgList{$id};
          $OrphanedList{$id}= [$source,$src_oper,$dest,$dst_oper,$time,$size];
        }
      }

    }
    if(defined $MsgList{$id}) {
      $MsgList{$id}= [$source,$src_oper,$dest,$dst_oper,$time,$size,$inQueue];     }
  }
}

if(%MsgList) { # print messages that were not removed from queue   print "\nGhost messages:\n";
  foreach $id (keys %MsgList) {
    my $data=$MsgList{$id};
    ($source,$src_oper,$dest,$dst_oper,$time,$size)=@$data;     print "$time id=$id Src=$source ($src_oper) To=$dest $dst_oper ($size bytes)\n";   }
}

if(%OrphanedList) { # messages with unknown origin   print "\nOrphan messages:\n";
  foreach $id (keys %OrphanedList) {
    my $data=$OrphanedList{$id};
    ($source,$src_oper,$dest,$dst_oper,$time,$size)=@$data;     print "$time id=$id Src=$source ($src_oper) To=$dest $dst_oper ($size bytes)\n";   }
}

if(%PerAccoountList) {
  print "\nPer Account Traffic:\n";
  foreach $id (sort keys %PerAccoountList) {     my $data=$PerAccoountList{$id};
    my ($mailsIn,$bytesIn,$mailsOut,$bytesOut)=@$data;

format STDOUT =

@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @>>>> @>>>>>> @>>>> @>>>>>>
$id,$mailsIn,$bytesIn,$mailsOut,$bytesOut .

# This will be displayed on the top of the each output page. format STDOUT_TOP =

                                                 Mails         Mails
Address                                             In   Bytes   Out   Bytes
================================================ ===== ======= ===== =======
.

    write;
  }   

}

sub PurgeName { # remove prefixes from some names   my $name = $_[0];
  return $1 if($name =~/LOCAL\((.*)\)/);   return $1 if($name =~/LIST\((.*)\)submit/);

  return $2 if($name =~/SMTP\((.*)\)(.*)/);   return $name;
}

sub isDesired($addr) {
  my $addr= $_[0];

  return 1; #remove this line for the filtered output

  if($addr =~/\@/) {
    return 1 if($addr =~/\@mydomain\.com/); # insert your domain here     return 0;
  }
  return 0 if($addr =~/[\[\]\s]/); # IP address or 'Dequeuer Report'   return 1; #or 0 if you don't want mails for the main domain to be counted }

sub AddToOutput($source) {
  my $source= $_[0];
  my ($mailsIn,$bytesIn,$mailsOut,$bytesOut);   if(defined $PerAccoountList{$source}) {     my $data=$PerAccoountList{$source};
    ($mailsIn,$bytesIn,$mailsOut,$bytesOut)=@$data;   } else {
    $mailsIn=$bytesIn=$mailsOut=$bytesOut=0;   }
  ++$mailsOut; $bytesOut+=$size;
  $PerAccoountList{$source}= [$mailsIn,$bytesIn,$mailsOut,$bytesOut]; }

sub AddToInput($dest) {
  my $dest= $_[0];
  my ($mailsIn,$bytesIn,$mailsOut,$bytesOut);   if(defined $PerAccoountList{$dest}) {
    my $data=$PerAccoountList{$dest};
    ($mailsIn,$bytesIn,$mailsOut,$bytesOut)=@$data;   } else {
    $mailsIn=$bytesIn=$mailsOut=$bytesOut=0;   }
  ++$mailsIn; $bytesIn+=$size;
  $PerAccoountList{$dest}= [$mailsIn,$bytesIn,$mailsOut,$bytesOut]; }


  Roman

##################################################################
Вы получили это сообщение потому, что подписаны на список рассылки   <CGatePro@mx.ru>.
Чтобы отписаться, отправьте сообщение на адрес <CGatePro-off@mx.ru>
Чтобы переключиться в режим дайджеста - mailto:<CGatePro-digest@mx.ru>
Чтобы переключиться в индексный режим - mailto:<CGatePro-index@mx.ru>
Для административных запросов адрес <CGatePro-request@mx.ru> Получено Thu Apr 06 14:28:45 2000

Этот архив был сгенерирован hypermail 2.1.8 : Tue 21 Feb 2006 - 03:14:01 MSK