Titel: Logformat / Daily Log mit Fifo's Beitrag von: Claus am 15. Mai 2003, 22:23:43 Ein Codeschnipsel zur Erstellung von Daily Log's.
Auf Basis von FIFO's (named pipes) Siehe man mkfifo. Voraussetzung ist das Vorhandensein einer Fifo Datei. In diesem Beispiel 'proftpd_log.fifo' Das Logformat in der proftpd.conf sieht wie folgt aus. LogFormat default "IP|%a|CMD|%m|CMDLine|%r|USR|%u|TIME|%{%F %T}t|FileN|%f|CODE|%s" In dieser Variante werden "Schlüssel" mitgegeben (Nicht für ein "Daily Log" notwendig). Die Übergabe in der conf ExtendedLog /usr/local/proftpd/var/log/proftpd_log.fifo ALL default Hier wird als Logdatei die Fifodatei angegeben. Wer kein Perl hat kann es sicher auch zu einem Shellscript umbauen. Code: #!/usr/bin/perl ####################################################################### #Script wertet das Logformat vom Proftpd das in eine Fifo #umgeleitet wurde aus und erstellt ein Log mit dem Dateinamen #des Aktuellen Tages. #Darüber hinaus wird in diesem Codeschnipsel die Übergabe #der Logvariablen mit Schlüsseln in ein Hash übergeben. #Über die Schlüssel angesprochen werden die Werte #in Variablen gespeichert die zu einer weiteren Verarbeitung #dienen können. ####################################################################### #Pfad zur FIFO $LogFifo = '/usr/local/proftpd/var/log/proftpd_log.fifo'; $i = 1; while ($i ==1) { #--------------------------------------------------------------- #Hier "lauscht" das Script auf Logfile Daten vom Proftpd. #Sind welche vorhanden werden diese zeilenweise in $GetString #eingelesen. open FIFO, "<$LogFifo" or die "can't read $LogFifo: $!"; $GetString = <FIFO>; #---------------------------------------------------------------- #While Schleife prüft bei gefülltem $GetString auf String "stop", #dieser kann manuell an das FIFO gesendet werden um das Script #sauber zu beenden. while($GetString ne ''){ $hit = index($GetString,"stop"); if($hit != -1){ $i=2; } #-------------------------------------------------------------------- #-------------------------------------------------------------- #Das Hash wird mit den entsprechenden Infos vom Proftpd gefüllt. #Hierbei werden, die in der Conf definierten Schlüssel dem Hash #ebenfalls als Schlüssel übergeben. %Arr = split('\|',$GetString); #-------------------------------------------------------------- #-------------------------------------------------------------- #Dieser Block übergibt an die benötigeten Variablen zur weiteren #Verarbeitung die Werte aus dem Hash. $User = $Arr{USR}; $Zeit = $Arr{TIME}; $CmdLine = $Arr{CMDLine}; $ClientIP = $Arr{IP}; $Cmd = $Arr{CMD}; $FileName = $Arr{FileN}; $Code = $Arr{CODE}; $timestmp = &getDate; #Aktuelles Datum ermitteln. #--------------------------------------------------------------- #--------------------------------------------------------- #Das ganze wird in ein Log das als Dateiname das #Aktuellem Datum hat geschrieben. #z.b. 15052003 open(LOGFILE,">>/usr/local/proftpd/var/log/$timestmp"); print LOGFILE $GetString; $GetString = <FIFO>; } close LOGFILE; #--------------------------------------------------------- close FIFO; sleep 1; } ############################################################################## #---Start Prozeduren und Funktionen ############################################################################## sub getDate{ $jahr = (1900+(localtime)[5]); $monat = sprintf("%02d",(localtime)[4]+1); $tag = sprintf("%02d",(localtime)[3]); $AktDatum = $tag.".".$monat.".".$jahr; return($AktDatum); } |