Logging in Skripten
- Urspruenglicher Autor: Dirk Deimeke
- Urspruengliches Datum: 22.07.2011
Wenn Shell-Skripte eine gewisse Groesse bekommen, mehrere systemkritische Operationen ausfuehren oder sogar interaktiv von Benutzern gesteuert werden, ist es sinnvoll, ein eigenes Logfile anlegen zu lassen. Selbstverstaendlich kann man aus einem Shell-Skript heraus mit dem Programm logger Meldungen direkt an den Syslog-Daemon schicken. Oft ist es aber sinnvoller, ein eigenstaendiges Log zur Auswertung zu besitzen.
log4bash bietet genau diese Moeglichkeit. Wenn die bash nicht verwendet wird, lohnt sich ein Blick auf das allgemeinere log4sh.
Die Einfachste Anwendung ist das folgende Kurzskript myfirstlog.bash
:
#!/bin/bash source /home/dirk/scripts/log4bash.sh log4bash 0 Meldung
Durch das Einbinden kann man die Funktion log4bash direkt im Skript aufrufen. Der Aufruf des Skripts erzeugt eine Logdatei, die zum Skriptnamen passt, an die das Datum angehaengt ist und die auf .log
endet. In unserem Beispiel heisst sie also myfirst-log.bash.jjjjmmdd.log
, wobei jjjjmmdd
fuer das heutige Datum steht. In dem neu erstellten Log findet sich folgende Meldung: 2010-11-01 19:09:49.748490329 CET|DEBUG|0|main|meldung
Die Logeintraege bestehen aus fuenf Elementen:
- Datum, Uhrzeit und Zeitzone: Nach dem Muster YYYY-MM-DD HH:MM:ss.N Z wird das Datum angegeben.
- Loglevel: Das Loglevel wird ueber folgende Zahlenwerte angegeben:
0 = DEBUG 1 = INFO 2 = WARN 3 = ERROR 4 = CRITICAL 5 = FATAL
- Zeilennummer: Ohne Angabe wird die Zeilennummer (wie im Beispiel) auf 0 gesetzt. Diese kann fuer weitere (eigene) Auswertungszwecke beliebig vergeben werden – zum Beispiel in der gleichen Notation wie HTTP-Statuscodes.
- Funktionsname: Ohne die ebenfalls beliebige Angabe wird als Funktionsname main gesetzt.
- Meldung: Abschliessend wird die uebergebene Meldung ausgefuehrt.
Entsprechend diesen Elementen kann man log4bash mit mehreren Parametern aufrufen. Der folgende Aufruf wuerde eine Logmeldung der Stufe INFO
mit der Zeilennummer 20
, dem Funktionsnamen Funktion
und der Meldung Meldung
, die aus mehreren Woertern besteht, erstellen.
log4bash 1 "Meldung aus mehreren Woertern" 20 Funktion
Im Log wird dies entsprechend hinterlegt:
2010-11-01 19:29:50.627352792 CET|INFO|20|Funktion|Meldung aus mehreren Woertern
Damit laesst sich ein gut durchsuchbares Basis-Logging realisieren. Das Verhalten von log4bash laesst sich mit den folgenden Variablen beeinflussen.
L4B_DELIM
: Definiert das Trennzeichen (Default:|
)
L4B_DATE
: Datumskommando (Default:date
)
L4B_DATEFORMAT
: Datumsformat-Spezifikation (Default:+%Y-%m-%d %H:%M:%S.%N %Z
)
L4B_VERBOSE
: Gibt an, ob die Logmeldung auch auf dem Bildschirm ausgegeben werden soll (Default:false
)
L4B_LABEL
: Feld (Array) mit den Logleveln
L4B_LOGFILE
: Namensgebung der Logdatei (Default:<SKRIPT_NAME>.<DATUM>.log
)
L4B_DEBUGLVL
: Schwellenwert, der angibt, ab wann Meldungen ins Log geschrieben werden (Default: 0 = Alles wird geloggt.)
Das fuehrt zu folgendem Beispiel:
#!/bin/bash source /home/dirk/scripts/log4bash.sh declare -a L4B_LABEL=(DEBUG INFO WARN ERROR CRITICAL FATAL ENDOFWORLD) L4B_DEBUGLVL=1 L4B_DELIM=" " L4B_DATE="date" L4B_DATEFORMAT="+%Y%m%d-%H%M%S.%N" L4B_VERBOSE=true L4B_LOGFILE="skript.log" log4bash 1 "1. Meldung" 15 Hauptprogramm L4B_VERBOSE=false log4bash 0 "2. Meldung" 25 Hauptprogramm log4bash 1 "3. Meldung" 25 Hauptprogramm
Nach dem Ausfuehren des Skriptes findet sich in der angegebenen Log-Datei skript.log
folgender Inhalt:
20101101-135700.980323531 INFO 15 Hauptprogramm 1. Meldung 20101101-135701.026624750 INFO 25 Hauptprogramm 3. Meldung
Bereits waehrend der Ausfuehrung wurde die erste Meldung auch auf dem Bildschirm ausgegeben. Meldung 3 hingegen findet sich nur im Log wieder, da die Variable L4B_VERBOSE
vor der Verarbeitung auf false
gesetzt wurde. Meldung 2 wurde weder auf dem Bildschirm ausgegeben noch in die Log-Datei geschrieben. Dies ist darauf zurueckzufuehren, dass der zweiten Meldung der Loglevel 0
zugewiesen wurde. ueber die Zuweisung der Variable L4B_DEBUGLVL
auf den Wert 1 wurde log4bash angewiesen, nur Logeintraege zu protokollieren, die mindestens dem Loglevel 1 entsprechen.