Log-Files überwachen mit Perl etc ...

Florian Lohoff flo at rfc822.org
Thu Jul 18 15:36:02 CEST 2002


On Thu, Jul 18, 2002 at 02:00:52PM +0200, Markus Wigge wrote:
> Kennt jemand das File::Tail Modul und kann mir sagen woran das merken 
> kann das jetzt nichts mehr kommt? Das Tool sollte sich nach dem rotieren 
> nach möglichkeit beenden und neu gestartet werden...

Du willst eigentlich merken wenn es rotiert wird und das neue file
oeffnen.  
Ich habe das geloest in dem ich auf den filename und auf den
filedescriptor des offenen files regelmaessig ein "stat" bzw "fstat"
mache und dann die inode nummer vergleiche - Wenn die sich aendern 
dann hat das script "file" -> "file.old" umbenannt und "file" neu
erzeugt. Die andere moeglichkeit ein logfile zu rotieren ist eine
kopie anzufertigen und die datei zu truncaten "cat /dev/null >file"
was dann aber darin endet das die datei "kleiner" wird also beim stat
die "filesize" kleiner wird als die beim letzten mal.

> Gibt es evtl. noch andere Möglichkeiten? Kann Syslog evtl. auch ein 
> Programm starten dem der Eintrag übergeben wird statt es in einen FIFO 
> zu schreiben?

Nein - Problem mit der fifo ist IIRC das wenn du die auf der einen seite
schliesst und kommt beim naechsten mal nichts mehr oder so ... Habe da
mal mit rumgespielt aber nichts genaueres weis man nicht mehr.

Hier meine "getline" variante ...

sub tailopen {
        open(tailfile,$logname) || die "file open failed";
        sysseek(tailfile,0,SEEK_END) || die "seek failed";
}

sub tailgetline {
        my($buffer,$failcount);
        while() {
                return $1 if ($tailbuffer =~ s/^(.*\n)//);
                my $len=sysread(tailfile,$buffer,4096); 
                $tailbuffer.=$buffer;

                # Did we read something ?
                if ($len == 0) {
                        # Stat filedescriptor and filename
                        my @fs; my @ns;
                        if (!(@fs=stat(tailfile)) || !(@ns=stat($logname))) {
                                die "Stat failed"
                        }
                        if ($fs[1] ne $ns[1] ||                 # Inode changed ?
                                $fs[7] < sysseek(tailfile,0,SEEK_CUR)) {        # File truncated ?
                                # Reopen file (no SEEK_END)
                                close(tailfile);
                                open(tailfile,$logname);
                        } else {
                                select(undef,undef,undef,0.33);         
                        }
                }
        }
}

Vorteil dieser variante ist das die zeilen waerend des rotierens nicht
verloren gehen.

Flo
-- 
Florian Lohoff                  flo at rfc822.org             +49-5201-669912
                        Heisenberg may have been here.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 232 bytes
Desc: not available
URL: <http://lug-owl.de/pipermail/linux/attachments/20020718/68a4c6f0/attachment.sig>


More information about the Linux mailing list