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:

Weitere Posts