Кабинет
1. Практически резюме
2. Quest игры
3. Joomla!
  · Joomla! LocalLinker
4. Мои работы
  · Low-traffic KharkovForum.com
  · Краситель таблиц
  · Http-лог Eserv
  · Спам-фильтр под Eserv
  · Удаление архивов видеонаблюдения
  · Конвертор расходных документов
  · Перевод LJ moods
  · Логотипы IDO group
  · Переводчик транслита
  · Переводчик дат
5. HTML в BBC
6. Это я люблю (± 100)
7. Страница памяти
Последние новости
 17.05.10 Вернулись из путешествия по Средней Азии! Киргизстан (Бишкек, Ош, Иссык-Куль) - Узбекистан (Ташкент, Хива, Бухара, Самарканд) - Та... »»
Поиск

Вид из окна
Варшава. Лазенки.
Быстрый переход
Полезно
Достопримечательности Украины Система Orphus
Статистика
Rambler's Top100
      Прихожая    Гостиная    Кабинет    Библиотека    Детская    Выход
Http-лог  

<!-- о скрипте -->

Cкрипт разбирающий http-логи Eserv'а (DDNNstat.log). Показывает общий трафик, трафик по машинам сети, адреса сайтов куда ходили и сколько метров на каждый из них потратили.


Суть работы:
  1. Есть строка в лог-файле:
    13:05:19 471 HTTPP;192.168.0.230;pawan; {+}
    GET httр://www.easytrace.com/work/images/spacer.gif HTTP/1.0;200; {+}
    httprecv;43;546;79

    согласно справке эти поля обозначают:

    Время НомерПотока Протокол;IPХоста;Юзер; {+}
    Запрос;КодЗавершения;{+}
    Referer;Размер;ВремяЗагрузки;CPS
    hh:mm:ss threadnumber protocol;ip;user;query;result;rem;size;time;bps

  2. Для начала скрипт считывает названия всех файлов в указанной директории ($dirin) и формирует список подходящих (за указанный месяц)
  3. Затем он считывает эти файлы построчно, разбирает строку на составляющие и формирует новые временные файлы типа (IP-MM.txt) заполняя из строками выбранными из общих файлов статистики и относящихся только к данному IP.
  4. После этого он считывает уже эти временные файлы. Разбирает строку, выделяет из URL имя домена, суммирует все байты относящиеся к данному домену (иногда не совсем корректно :() и машине в целом. Для уменьшения размеров отчета в отчет записываются сайты накоторые было потрачено более 0,1 МГб, остальные не отображаются (их трафик просто плюсуется к общему)
  5. В конце отчета формируется итоговая таблица содержащая:

    № п/п - IP - Сетевое имя - Трафик, МГб - Суммарный трафик


Исходный код:
#!/usr/bin/perl

%comps=(
  "192.168.0.229" => "Vera",
  "192.168.0.230" => "Pawan (Notebook)",
  "192.168.0.231" => "Misha",
  "192.168.0.232" => "Manish",
  "192.168.0.233" => "Security",
  "192.168.0.234" => "Sveta",
  "192.168.0.235" => "Vika",
  "192.168.0.236" => "Caket",
  "192.168.0.237" => "Pawan (Server)",
  "192.168.0.238" => "Larisa",
  "192.168.0.239" => "Ptaha",
  "192.168.0.240" => "Artem",
  "192.168.0.241" => "Olga",
  "192.168.0.242" => "Yurist",
  "192.168.0.243" => "Lara",
  "192.168.0.244" => "Sklad-K",
  "192.168.0.245" => "Sklad-S",
  "192.168.0.246" => "Provisor (Andrey)",
  "192.168.0.247" => "Operator (Sveta)",
  "192.168.0.248" => "Lida",
  "192.168.0.249" => "Sky (Yuly)",
  "192.168.0.250" => "Server",
  "192.168.0.251" => "Sanjeev (Notebook)",
  "192.168.0.255" => "Designer"
);
$dirin="D:/Eserv2/log/1/";
$dirout="D:/Eserv2/reports/";
$ext=".html";
$i=0;

print "Input month number (MM)\n";
$mm=;
chomp($mm);
$mm=sprintf('%02d',$mm);

$filename=$mm."_http$ext";
$printfile="<head><title>Http статистика Eserv за $mm месяц.</title>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">
<meta name=author content=\"Artem A. Sapronov, сopyright 2002 - capric@ukr.net\"></head>
<body><h3>Запрошена статистика за $mm месяц.</h3><b>Выбираю файлы к обработке.</b><br>";
$i=0; my (@f);
opendir (DIR, $dirin) || die "couldn't open $dirin : $!\n";
 while ( defined ($file=readdir(DIR))) {
  next if $file=~ /^\.\.?$/;
  if ($file=~ /^$mm/ && $file=~ /STAT\.LOG/i) { 
   $f[$i]=$file;
   $i++;
  }
 }
closedir (DIR);
@f=sort {$a <=> $b} @f;
if ($#f>=0) {
 $printfile.="Выбрал ".($#f+1)." файлов для обработки.<br>\n";
 print "\nSelect ".($#f+1)." files for read.\n";
 $cs=0;$cf=0;$alltime=0;$starttime=0;$endttime=0;$n=0;
 foreach $i (@f) {
  open (FILE, "<$dirin$i");
   $starttime=time;
   $cf++;
   $printfile.="<dd>Начал обработку файла $dirin$i.";
   print "Start to read file $dirin$i.\n";
   $cs=0;
   while () {
    chomp;
    ($t,$ip,$name,$get,$field1,$field2,$byte,$field3,$field4)=split(/;/,$_);
    open (F, ">>$dirin$ip-$mm.txt");
     print F "$_\n";
    close (F);
    if (!$statfile{"$ip-$mm.txt"}) {$statfile{"$ip-$mm.txt"}=1;}
    else {$statfile{"$ip-$mm.txt"}=$statfile{"$ip-$mm.txt"}+1;}
    $n++;
    $cs++;
   }
  close (FILE);
  $endtime=time;
  $alltime+=$endtime-$starttime;
  $printfile.="<dd><dd>Обработал ".$cs." строк за ".($endtime-$starttime). {+}
  {+} " секунды. Закончил обработку файла $dirin$i удачно.<br>\n";
  print "  Read ".$cs." lines on ".($endtime-$starttime)." sec.\n  Finished  {+}
   {+} to read file $dirin$i successfuly.\n\n";
    
 }
 $printfile.="Обработал ".$cf." файлов за $alltime секунды. Закончил удачно.<br><br>
 <hr><b>Приступаю к обработке файлов по IP адресу.</b><br>\n";
 print "Read ".$cf." files on $alltime sec. Finished successfuly.\n {+}
  Start to make report by IP.\n";
 foreach $key (sort keys %statfile) {
  $ip=substr($key,0,length($key)-7);
  if (!$comps{$ip}) {$compname="Не известно";}
  else  {$compname=$comps{$ip};}
  $printfile.="<br><i>IP=<b>$ip</b> Сетевое имя: <b>$compname</b></i><br>\n";
  my %names; my %urls; my %field1; my %field3;my %field4;
  open (FILE, "<$dirin$key");
   while () {
    chomp;
    ($t,$ip,$name,$get,$field1,$field2,$byte,$field3,$field4)=split(/;/,$_);
    if (!$names{$name} && $name ne '') {$names{$name}=$name;}
    $get =~ s/www\.//;
    $get =~ /\\*.\\/;
    ($domain) = $get =~ m!(?:ht|f)tps?://(.+?\.(?:com|ru|net|org|edu|ua))!; 
    if (!$urls{$1}) {$urls{$1}=$byte;}
    else {$urls{$1}=$urls{$1}+$byte;}
    if (!$field1{$1}) {$field1{$1}=$byte;}
    else {$field1{$1}=$field1{$1}+$field1;}
    if (!$field3{$1}) {$field3{$1}=$byte;}
    else {$field3{$1}=$field3{$1}+$field3;}
    if (!$field4{$1}) {$field4{$1}=$byte;}
    else {$field4{$1}=$field4{$1}+$field4;}
   }
  close (FILE);
  unlink ("$dirin$key");
  print "  Delete file $dirin$key\n";
  $printfile.="<dd>выходили в сеть:";
  foreach $value (sort values %names) {
   $printfile.=" $value,\n";
  }
  $printfile.="<dd>посещали сайты (показаны те, трафик по которым более 0.1 Мгб):<ol>\n";
  foreach $url (sort keys %urls) {
   $byte=$urls{$url};
   if ($url ne '') {
     if (int($byte/1048576*10)>=1) {
     $printfile.="<li><a href=http://www.$url target=_blank>www.$url</a> {+}
	  {+} [ ".sprintf("%.2f",$byte/1048576)." МГб ]\n";
    }
    $summgbthis+=$byte;
   }
  }
   $printfile.="</ol><dd><strong>Всего прокачан трафик в размере (Мгб): <b>". {+}
    sprintf("%.3f",$summgbthis/1048576)."</b></strong><hr>\n";
  $summgb{$ip}=$summgbthis;
  $summgbthis=0;
 }
 $printfile.="<h3>Итоговая таблица.</h3><table border=1 width=70%><tr><th>№</th>
  <th>IP адрес</th><th>Сетевое имя</th><th>Трафик, МГб</th></tr>\n";
 $i=1;
 foreach $ip (sort keys %summgb) {
  $sum+=$summgb{$ip};
  if (!$comps{$ip}) {$compname="Не известно";}
  else  {$compname=$comps{$ip};}
  $printfile.="<tr><td> ".$i++."</td><td> $ip</td><td> $compname</td>
  <td> ".sprintf("%.3f",$summgb{$ip}/1048576)."</td></tr>\n";
 }
 $printfile.="<tr><td colspan=3 align=right><b>Суммарный трафик за ".($#f+1)." дней,{+}
  {+} МГб: </b></td><td><b> ".sprintf("%.3f",$sum/1048576)."</b> {+} 
  {+} </td></tr></table>\n";
} else {
 $printfile.="Файлов для обработки не найдено. Скорректируйте запрос.<br>";
}
$printfile.="<br><small>&copy 2002 <a href=mailto:инфо@Сапронов.ком>Artem Sapronov</a>{+} 
 {+}, Анализатор http-логов программы Eserv<br>
<a href=//www.sapronov.com>www.sapronov.com</a></small></body></html>"; 
open (FILE, ">$dirout$filename") || die "Can't create $file_eserv$ext:\n$!\nand\n$^E";
 print FILE $printfile;
close (FILE);
exec "start $filename";

Итог работы:

Пример получившегося файла в результате работы скрипта вы можете увидеть если пойдете по этой ссылке (28 кб).


<!-- примечание -->
  1. Знак {+} означает что вы должны соединить эту и следующую строки в одну без пробелов.
  2. Где взять Eserv? http://www.eserv.ru
<!-- спасибо! -->
: BBCode
: HTML


<!-- внимание! -->
  • Код, текст и фотографии размещенные на этом сайте принадлежат их автору - Сапронову Артёму Александровичу.
  • Допускается использование материалов сайта в личных целях.
  • Приветствуется распространение с обязательным указанием активной гиперссылки на страницу, с которой взят материал.
  • Запрещается внесение изменений в исходный текст (в том числе синонимизация и рерайт).
  • Использование материалов сайта в коммерческих целях без согласования с автором запрещено.
  • Обращайте внимание на даты. Некоторые страницы морально устарели.
  • Автор не несет отвественности за любые возможные последствия связанные с использованием материалов сайта.
  • С предложениями, замечаниями или пожеланиями обращайтесь по email.

© 25.09.2002 Артем Сапронов
http://www.sapronov.com

Краситель таблиц ↑↓  ← Ctrl →  Спам-фильтр под Eserv 
Никакое притворство не может долго скрывать любовь, когда она есть или изображать - когда её нет.
[ ЛАРОШФУКО, Франсуа де ]