Deutsch
Germany.ruФорумы → Архив Досок→ Linux & Co

MRTG - 95th percentile accounting - PERL Crashkurs

223  
  anatoli888 свой человек19.05.09 23:08
19.05.09 23:08 
мне нужно настроить в MRTG 95% Abrechnung. да так что бы на текущий день, неделю, месяц
моя проблема в перле.
тут патч для дебиана http://www.ronny-goerner.de/patch/
его нужно запускать раз в час чтобы добиться желаемого результата
мне нужно этот перл скрип изменить так чтобы считывались данные из логов за заданый промежуток времени (день, месяц, год) и на основе этих данных расчитывался 95th percentile accounting.
тут этот скрипт.
В ответ на:

#!/usr/bin/perl
#
# For more info about this script, see http://www.seanadams.com
#
$basedir= "/var/www/mrtg"; # This directory where mrtg saves its .log and .html files
$snapshots="/var/www/mrtg/snapshots"; # Where 95.pl will save a daily copy of the .log files
$today=`date +\%Y\%m\%d`;
chop $today;
$snapdir="$snapshots/$today";
`mkdir $snapshots` if (!-d$snapshots);
`mkdir $snapdir` if (!-d$snapdir);
opendir WWW, $basedir;
foreach $logname (readdir(WWW)) {
next if (!($logname=~/\.log$/));
#print "$logname\n";
open INFILE, "$basedir/$logname" || die "Couldn't read $basedir/$logname";
open OUTFILE, ">$snapdir/$logname" || die "Couldn't write to $snapdir/$logname";
$now=<INFILE>;
for ($i=1;$i<=288;$i++) { # 288 five minute samples for a 24hr window
$sample=<INFILE>;
chop $sample;
$sample=~/(\d+) \d+ \d+ (\d+) (\d+)/ || die "Couldn't parse $basedir/$logname";
print OUTFILE "$1 $2 $3\n";
}
close INFILE;
close OUTFILE;
}
opendir SNAPSHOTS, "$snapshots";
foreach $date (readdir(SNAPSHOTS)) {
next if ($date eq '.');
next if ($date eq '..');
push @dates,$date;
}
@dates=sort {$a<=>$b} @dates;
while ((@dates)>30) {
shift(@dates);
}
foreach $date (@dates) {
opendir SNAPSHOTS, "$snapshots/$date";
foreach $log (readdir(SNAPSHOTS)) {
next if ($log eq '.');
next if ($log eq '..');
open LOG, "$snapshots/$date/$log";
$log=~s/\.log//;
$data{$log}.=join('',<LOG>);
}
}
foreach $target (keys(%data)) {
@lines=split(/\n/,$data{$target});
@samples=();
%samples=();
foreach $line (@lines) {
($time,$in,$out)=split(/\s+/,$line);
if ($in>$out) {
$samples{$time}=$in; #filter identical times using a hash
} else {
$samples{$time}=$out;
}
}
foreach $key (keys(%samples)) {
push @samples,$samples{$key};
}
$nfindex=int((@samples)*.95);
@sorted=sort {$a<=>$b} @samples;
$nf=int($sorted[$nfindex]*8/1024*100)/100;
open DATA95, ">$basedir/$target.95";
print DATA95 "$nf";
}

я выяснил что
В ответ на:

for ($i=1;$i<=288;$i++) { # 288 five minute samples for a 24hr window
$sample=<INFILE>;
chop $sample;
$sample=~/(\d+) \d+ \d+ (\d+) (\d+)/ || die "Couldn't parse $basedir/$logname";
print OUTFILE "$1 $2 $3\n";
}

тут выводятся первые 288 строчек, т.е. 288*5=1440 минут в дне, т.е если каждые 5 минут делается лог то 288 логов это все данные за последние 24 часа.
что мне лучше сделать что бы выбрать из лога определенный заданый промежуток времени.
логи идут в следующем формате. (log doku mrtg)
как конкретно мне нужно изменить скрипт.
есть ли лучше предложения?
#1 
  anatoli888 свой человек19.05.09 23:12
NEW 19.05.09 23:12 
в ответ anatoli888 19.05.09 23:08
речь идет о считывании данных сo свитча и интерпетировании их через mrtg.
#2