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.

Zurück zur Uebersicht