Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Witam
Zastanawiam sie jak najlepiej (najwydajniej) napisac skrypt ktory analizuje na bierzaco plik access.log pod katem adresow IP.
taki pliczek zajmuje okolo 150 MB. Zalezy mi na wydajnosci.
Zaznaczam ze nie chce robic czegos takiego ze wyciagam jeden IP z gory, nastepnie przegladam caly plik access.log, w poszukiwaniu takiego samego IP, i potem z kolejnym IP to samo. Zbyt duzo zasobow by to zjadlo, a skrypt by sie w koncu wykonal po paru godzinyach, jakby mu dobrze poszlo.
Jakbyscie ten problem rozwiazali?
Jakis algorytm?
Z gory dziekuje za wszelkie propozycje.
Z wyrazami Szacunku
adam05
Offline
kombinacja sort, uniq i head? może awk?
choć wydaje mi sie, że lepiej by było użyć pythona, perla czy innego "wyższego" języka, powinien być bardziej wydajny (zwłaszcza przy takiej skali)
Ostatnio edytowany przez azhag (2008-09-17 15:36:07)
Offline
Zależy też co znaczy "pd kątem danego ip" i "na bieżąco" ....
Offline
czadman napisał(-a):
Zależy też co znaczy "pd kątem danego ip" i "na bieżąco" ....
Czyli przykładowo w access.log wyskoczy ip 10.0.0.1 i ten hit ma być zaliczony na "konto" 10.0.0.1.
Na końcu skrypt ma przedstawić top 10 adresów IP.
Offline
#!/usr/bin/perl use strict; use warnings; my $file = 'sciezka/do/pliku'; my %ips; open FILE, '<'.$file or die "Nie można otworzyć $file tylko do odczytu: $!\n"; while (<FILE>) { if (/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/) { my $count = $ips{$1} ? $ips{$1} : 0; $ips{$1} = $count + 1 ; } } close FILE; #-------------------------------------------------- # http://www.devdaily.com/perl/edu/qanda/plqa00016/ #-------------------------------------------------- sub hashValueDescendingNum { $ips{$b} <=> $ips{$a}; } my $i = 0; foreach my $key (sort hashValueDescendingNum (keys(%ips))) { last if ($i++ >= 10); print $ips{$key} . " wystąpień adresu ".$key . "\n"; }
Z FAQ-a wynika, że perl czyta plik linia po linii (nie kopiuje go całego do pamięci), więc zużycie zasobów powinno być minimalne niezależnie od wielkości pliku. Ale możesz poobserwować czy tak będzie rzeczywiście (jeżeli jest tam bardzo dużo różnych adresów IP, to jednak może być zauważalnie).
Tak między nami, powinieneś potrafić sam sobie to napisać.
Offline
Nie prościej zainstalować gotowe staty. Jest tego mnóstwo.
Offline
Prościej :) .
Offline
Strony: 1