Login
Newsletter
Di, 8. Oktober 2002, 07:59

Syslog aus Shell-Skripten nutzen

Wer größere Shell-Skripte schreibt, möchte vielleicht auch mit Hilfe von Syslog den Ablauf des Skripts festhalten.

Dabei hilft einem der Befehl "logger". Ich möchte hier nicht weiter auf "logger" eingehen, sondern eine von mir geschriebene Funktion der Pro-Linux-Gemeinde zur Verfügung stellen, die das Loggen aus Shell-Skripten vereinfacht. Getestet mit sh und bash.

Die Funktion LOG() ermöglicht das Mitschreiben von Ereignissen nach Syslog und bietet auch eine gesprächige Ausgabe (Verbose).

Damit LOG() einwandfrei läuft, müssen ein paar Variablen gesetzt werden:

SYSLOG="YES"
VERBOSE="YES"
LOGGER="/usr/bin/logger"
FACILITY="Local1"


  • $SYSLOG auf "YES" oder "NO" gesetzt erlaubt oder verbietet das Schreiben ins Syslog.
  • $VERBOSE auf "YES" oder "NO" gesetzt legt fest, ob die Ausgabe im "Verbose-Modus" geschehen soll.
  • $LOGGER enthält den vollen Pfad zu dem Befehl "logger"
  • $FACILITY legt die Facility fest, wo der Logeintrag hingeschrieben werden soll (man syslog.conf oder logger).

Danach kann die Funktion dem Skript hinzugefügt werden. Später wird diese innerhalb des Skripts aufgerufen (Ziffern weglassen):

01: LOG()
02: {
03: PRIORITY="`echo $* | cut -d ':' -f1`"
04: LOGMESSAGE="`echo $* | cut -d ':' -f2-`"
05: LOGMESSAGE="`basename $0 | cut -d '.' -f1`[$$]:$LOGMESSAGE"
06: if [ "$VERBOSE" = "NO" ]; then
07: [ "$SYSLOG" = "YES" ] && $LOGGER -p $FACILITY.$PRIORITY $LOGMESSAGE
08: else
09: echo "`date '+%b %e %H:%M:%S'`: $LOGMESSAGE"
10: [ "$SYSLOG" = "YES" ] && $LOGGER -p $FACILITY.$PRIORITY $LOGMESSAGE
11: fi
12: }

Ein Aufruf aus einem Skript könnte dann wie folgt aussehen:

LOG "INFO:Programm $0 gestartet"

Und der Eintrag in Syslog würde dann so aussehen:

Sep 16 00:10:01 bender rafael: LOGSAVE:Programm logsave gestartet

Jetzt die Erklärung :-)

Ich fange bei dem Aufruf der Funktion an.

LOG "PRIORIETAET:TEXT"

LOG ist der Aufruf für die Funktion. Alles, was in den Anführungszeichen steht, wird an die Funktion übergeben. Um verschiedene Level der Priorität zu ermöglichen, wird innerhalb der Anführungszeichen zwischen Priorität und Logeintrag unterschieden. Der ":" trennt die Priorität von dem Logeintrag. Wenn man also einen Logeintrag mit der Priorität ERROR schreiben möchte, würde der Aufruf so aussehen:

LOG "ERROR:Ein Fehler ist aufgetreten".

Der Teil hinter dem ":" ist der Logeintrag.

Wem das reicht, der kann jetzt aufhören zu lesen und die Funktion in sein Skript einbinden. Wer noch wissen möchte, was in der Funktion LOG() passiert, sollte weiterlesen.

Alles, was sich beim Aufruf von LOG in Anführungszeichen befindet, wird an die Funktion übergeben und in die Variable $* geschrieben. In Zeile 03: wird alles vor dem ":" als Priorität ausgelesen und in die Variable $PRIORITY geschrieben. In Zeile 04: wird alles hinter dem ":" als Logeintrag in die Variable $LOGMESSAGE geschrieben und in Zeile 05: wird dieser Variablen noch die ProzessID des Skripts an den Anfang des Logeintrags hinzugefügt. In Zeile 06: wird dann abgefragt, ob die Ausgabe im "Verbose-Modus" oder im "Nicht-Verbose-Modus" stattfinden soll. Ist die Variable $VERBOSE auf "NO" gesetzt, wird nur der Eintrag in Syslog vorgenommen. Ist $VERBOSE auf "YES" gesetzt, wird in Zeile 09: der Logeintrag nach Standardout geschrieben und dann erfolgt in Zeile 10: der Eintrag ins Syslog. In Zeile 07: und 10: wird durch die Variable $SYSLOG noch abgefragt, ob überhaupt ein Eintrag ins Syslog gewünscht ist. Steht $SYSLOG auf "YES", wird der Befehl "logger" mit den entsprechenden Parametern aufgerufen. Mehr dazu in der Manpage von "logger".

Bei Fragen oder Problemen mit der Funktion könnt ihr mich gerne via E-Mail anschreiben.

Kommentare (Insgesamt: 8 || Alle anzeigen )
Re[3]: andersrum (Konfuzius, Do, 10. Oktober 2002)
Re[2]: andersrum (Dirk Larisch, Do, 10. Oktober 2002)
Re: andersrum (msi, Di, 8. Oktober 2002)
andersrum (Chris, Di, 8. Oktober 2002)
optimierung (kruemelkacker & ewiger besserw, Di, 8. Oktober 2002)
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten