File::Tail - Logdateien beobachten und analysieren
Veröffentlicht von Thomas Fahle am (Permalink)
Ein wesentlicher Teil der Arbeit eines Systemadministrators ist die Analyse von Log-Dateien. Diese wichtige, aber auch oft langweilige und daher auch gern unterlassene Tätigkeit lässt sich mit File::Tail von Matija Grabnar automatisieren.
File::Tail funktioniert so ähnlich wie das UNIX/Linux Tool tail -f, daher auch der Name des Moduls.
Beispiel:
#!/usr/bin/perl use strict; use warnings; use File::Tail; my $logfile = '/var/log/messages'; ### Defaults: ### maxinterval = 60 Sekunden ### interval = 10 Sekunden ### adjustafter = 10 Sekunden ### resetafter = adjustafter * maxinterval ### tail = 0 Nach der letzten Zeile starten my $tail = File::Tail->new( $logfile ) or die $!; my $line; while ( defined( $line = $tail->read) ) { process_line( $line ); } sub process_line { my ($line) = shift @_; # Machwas mit der Zeile print "$line"; }
Das Programm starten und anschließend ein
$ logger -i 'Hallo Welt'
in einem zweiten Terminal eingeben. Nach ca. 70 Sekunden (interval + maxinterval) sollte der neue Eintrag von File::Tail angezeigt werden.
Logrotate und File::Tail
File::Tail kann eigentlich gut damit umgehen, das die beobachtete Datei durch andere Programme, wie z.B. logrotate, verschoben und neu erstellt wird. Manchmal müssen dazu allerdings die Parameter maxintervall und adjustafter eingestellt werden. Optimale Werte erhält man nur durch Ausprobieren.
#!/usr/bin/perl use strict; use warnings; use File::Tail; my $logfile = '/var/log/messages'; ### Defaults: ### maxinterval = 60 Sekunden ### interval = 10 Sekunden ### adjustafter = 10 Sekunden ### resetafter = adjustafter * maxinterval ### tail = 0 Nach der letzten Zeile starten my $tail = File::Tail->new( name => $logfile, # Die letzten 5 Zeilen beim Start ausgeben tail => 5, # Datei alle 30 Sekunden pruefen maxinterval => 30, ) or die $!; my $line; while ( defined( $line = $tail->read) ) { process_line( $line ); } sub process_line { my ($line) = shift @_; # Machwas mit der Zeile print "$line"; }
Siehe auch:
- File::Tail
- Perltraining Australia: Course Notes Perl for System Administration S. 84 ff
- Perlmonks: Re: Man, File::Tail is just beating me down!
- Galileo Computing / <openbook> / Linux: Logging
- POE::Wheel::FollowTail (Eine Alternative)
- Perl Journal Column 01 (May 2003) Watching Logfiles