2010-09-18 9 views
5

Mam wiele dzienników dostępu w katalogu Logi, następujących konwencji nazewnictwa poniżej:Jak traktować wiele plików dziennika jako jeden wirtualny plik w Perlu?

access.log.1284642120 
access.log.1284687600 
access.log.1284843260 

Zasadniczo, dzienniki są „obrócone” Apache dziennie, więc mogą być sortowane w porządku.

Próbuję "odczytać je jeden po drugim", aby można było traktować je jako jeden plik dziennika.

my @logs = glob('logs/access.log.*'); 

Powyższy kod będzie glob wszystkie dzienniki, ale nie jestem pewien:

  • W jakiej kolejności będą dzienniki być zorganizowane, alfabetycznie?
  • jeśli chcę sprawdzić "najnowszy czas dostępu z unikalnego adresu IP", jak mogę to zrobić?

Mam skrypt Perla, który może odczytać pojedynczy dziennik dostępu i sprawdzić to łatwo (mój algorytm ma mieć duży skrót, który używa adresu IP jako klucza, a czas dostępu jako wartość, i po prostu kontynuuj pchanie pary klucza/wartości do niej ...). Ale nie chcę po prostu scalać wszystkich plików dostępu w jeden plik tymczasowy tylko dla tego procesu.

Wszelkie sugestie? Z góry bardzo dziękuję.

Odpowiedz

11

Jeśli chcesz, aby zapewnić szczególny porządek, porządek to sam, nawet jeśli tak, aby zapewnić sobie, że ona wyjdzie rację:

my @files = sort { ... } glob(...); 

W tym przypadku, w którym nazwy plików są takie same z wyjątkiem poszczególne cyfry, nie może wymagać blok sortowania:

my @files = sort glob(...); 

je czytać jako jeden über-file, lubię używać local @ARGV więc mogę użyć operatora diament, który jest naprawdę magiczne ARGV filehandle . Kiedy dojdzie do końca jednego pliku w @ARGV, przechodzi do następnego. To podróbki określenie wszystkich plików w linii poleceń poprzez przypisanie do @ARGV wewnątrz programu:

{ 
local @ARGV = sort { ... } glob(...); 

while(<>) { 
     ...; 
     } 
} 

Jeśli trzeba wiedzieć plik aktualnie przetwarzanie, spojrzeć w $ARGV.

Jeśli potrzebujesz czegoś bardziej wymyślnego, być może musisz użyć brutalnej siły.

+1

+1 dla interpunkcji. Podobnie jak metalowe opaski, odpowiedzi na to pytanie są lepsze z umlautami. – FMc

+0

Otrzymujesz także magię '$ .', śledzącą bieżący numer bieżącego pliku. – mob

2

W środowisku Unix-y można wykorzystać powłokę do grupy plików razem:

my @files = glob("$dir/access.log.*"); 
open my $one_big_logfile, "-|", "cat @files" or die ...; 
while (<$one_big_logfile>) { 
    ... 
} 
Powiązane problemy