Внимание! У вас отключен JavaScript. Некоторые страницы этого сайта будут работать некорректно или не будут работать совсем.
Последние новости
17.05.10 Вернулись из путешествия по Средней Азии! Киргизстан (Бишкек, Ош, Иссык-Куль) - Узбекистан (Ташкент, Хива, Бухара, Самарканд) - Та... »»
Полезно
Статистика
<!-- о скрипте -->
Cкрипт разбирающий http-логи Eserv'а (DDNNstat.log). Показывает общий трафик, трафик по машинам сети, адреса сайтов куда ходили и сколько метров на каждый из них потратили.
Суть работы:
Есть строка в лог-файле:
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
Для начала скрипт считывает названия всех файлов в указанной директории ($dirin) и формирует список подходящих (за указанный месяц)
Затем он считывает эти файлы построчно, разбирает строку на составляющие и формирует новые временные файлы типа (IP-MM.txt) заполняя из строками выбранными из общих файлов статистики и относящихся только к данному IP.
После этого он считывает уже эти временные файлы. Разбирает строку, выделяет из URL имя домена, суммирует все байты относящиеся к данному домену (иногда не совсем корректно :() и машине в целом. Для уменьшения размеров отчета в отчет записываются сайты накоторые было потрачено более 0,1 МГб, остальные не отображаются (их трафик просто плюсуется к общему)
В конце отчета формируется итоговая таблица содержащая:
№ п/п - 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>© 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 кб).
<!-- примечание -->
Знак {+} означает что вы должны соединить эту и следующую строки в одну без пробелов.
Где взять Eserv? http://www.eserv.ru
<!-- спасибо! -->
: BBCode
: HTML
<!-- внимание! -->
Код, текст и фотографии размещенные на этом сайте принадлежат их автору - Сапронову Артёму Александровичу.
Допускается использование материалов сайта в личных целях.
Приветствуется распространение с обязательным указанием активной гиперссылки на страницу, с которой взят материал.
Запрещается внесение изменений в исходный текст (в том числе синонимизация и рерайт).
Использование материалов сайта в коммерческих целях без согласования с автором запрещено .
Обращайте внимание на даты. Некоторые страницы морально устарели.
Автор не несет отвественности за любые возможные последствия связанные с использованием материалов сайта.
С предложениями, замечаниями или пожеланиями обращайтесь по email.
© 25.09.2002 Артем Сапронов
http://www.sapronov.com