ein Kapitel zurück                                           ein Kapitel weiter

Wollen sie Ausgaben von Programmen abfangen oder verwalten können sie die Funktion syslog verwenden. Mit syslog werden die Meldungen von lokalen Systemen und/oder Netzwerken ausgelesen und aufbereitet.

Die Meldung wir dann aus /dev/log gelesen und besteht aus 2 Teilen. Dem eigentlich Text und eine Kombination aus Typ (Facilities) und Priorität (Level).

Folgende syslog-Typen (facilities) können in der Nachricht sein.....

LOG_KERN            Kernel-Nachrichten
LOG_USER            Nachricht von Usern
LOG_MAIL            E-Mail-Subsystem
LOG_DAEMON          Verschienden Dämonen
LOG_SYSLOG          syslog-interne Nachrichten
LOG_LPR             Drucker-Subsystem
LOG_NEW             News-Subsystem
LOG_UUCP            UUCP-Subsystem
LOG_CRON            Cron-Dämon
LOG_AUTHPRIV        Authorisierung
LOG_LOCAL0...7      Reserviert für Eigenbedarf  

Die syslog-Priorität (Level) sieht folgendermaßen auf. Die Tabelle geht von oben (höchste Priorität) nach unter (niedrigste Priorität) durch...

LOG_EMERG     System ist unbrauchbar
LOG_ALERT     Dringed irgendwelche Aktionen einleiten
LOG_CRIT      Kritische Nachrichten
LOG_ERR       Normaler Fehler
LOG_WARNING   Warnung
LOG_NOTICE    Normale, bedeutende Nachricht
LOG_INFO      Normale Nachricht
LOG_DEBUG     Unwichtige Nachricht  

Nun wollen wir mal sehen wie wir in C aus dem syslogd - Dämon lesen können. Viele Dämonen rufen also die Funkiton syslog (Konsolenfunktion) auf um eine Nachricht zu erstellen. Dies Nachricht wird dann an das Unix Socket /dev/log geschickt.

Zuerst müssen wir also eine Verbindung zum Syslog aufbauen. Diese wird mit der Funktion.....

#include <syslog.h>

void openlog(char *ident, int option, int facility);  

Mit ident legen sie den Programmnamen fest. Diese Variable dient als Indenfizierer für erzeugte Syslog-Nachrichten. Dies ist üblicherweise der Programmname.

Folgende option und deren Bedeutung können sie verwenden (es kann auch eine ODER-Verknüpfung verwendet werden)....

LOG_CONS    Ausgabe erfolgt direkt auf die Konsole, sollte ein
            Fehler mit dem System-Login auftreten.
LOG_NDELAY  Verbindung zum Login-Dämon wird sofort aufgebaut. Nicht wie
            normalerweise, wenn die erste Nachricht geschrieben wurde.
LOG_PERROR  Die Nachricht wird außer an den syslogd - Dämon noch zusätzlich
            an den Fehlerkanal (stderr) geschickt.
LOG_PID     Wird ein Programm mehrfach gestartet, ist es sinnvoll diese Option
            zu verwenden, da jede syslog - Nachricht ein PID enthält.
            Sie können damit genau ermitteln welcher Prozeß diese Nachricht
            geschickt hat. Beispielsweise wenn sie mit fork eine Kindprozeß
            zur Erledigung bestimmter Aufgaben erzeugen.  

Die Syslog - Typen (facility) haben sie bereits am Anfang des Kapitels kennengelernt (LOG_KERN,LOG_USER,LOG_MAIL,LOG_DAEMON......).

Somit sieht ein openlog-Aufruf folgendermaßen aus.....

openlog("lpd-daemon", LOG_PID, LOG_LPR);  

Hier dient als Kennung 'lpd-daemon'. Es wird außerdem immer die Prozeß-ID mitausgegeben (LOG_PID) und als Einrichtung wird das Druckersystem verwendet.

Nach dem wir den STREAM mit openlog geöffnet haben, können wir nun mit der Funktion syslog eine Log-Nachricht erstellen......

#include <syslog.h>

void syslog(int priortät, char *format, ...);  

Als Pioritäten können sie ein der 8 verfügbaren verwenden, die sie weiter oben schon kennengelernt haben (LOG_EMERG, LOG_ALERT, LOG_CRIT.....). In format befindet sich die eigentlich Nachricht. Dazu können sie einen normalen Formatstring verwenden.

Bei Beendigung der Verbindung übernimmt openlog die Beendigung. Wollen sie aber während des Programmablaufes die facility ändern, müssen sie die Verbinung erst mit.......

#include <syslog.h>

void closelog(void);  

...schließen, um diese mit openlog wieder, mit den neuen facility's zu öffnen. Um Ihnen das ganze jetzt anhand eines Programms zu Demonstrieren erstellen wir jetzt einen eigenen Syslog-Typen (facility). Öffnen sie die Datei /etc/syslog.conf mit einem Editor (als root). Darin finden sie jetzt zum Beispiel folgenden Eintrag......

# Mail logging
mail.=debug;mail.=info;mail.=notice    -/var/log/mail/info
mail.=warn                             -/var/log/mail/warnings
mail.err                               -/var/log/mail/errors  

Was bedeutet nun....

mail.=debug;mail.=info;mail.=notice  

Dies heist nun, falls syslog eine Nachricht mit der Priorität LOG_DEBUG, LOG_INFO oder LOG_NOTICE erhält wird diese in die Datei /var/log/mail/info gelesen.

Liest syslog die Nachricht mit der Priorität LOG_WARNING wird dies in /var/log/mail/warnings gelesen. Wir wollen nun einen eigenen Typen (facility) festlegen, der eine Ausgabe auf /dev/tty1 macht. Mit LOG_LOCALx haben wir ja 8, wovon bei einer Neuinstallation keiner belegt sein sollte. Schreiben sie einfach ans Ende der Datei /etc/syslog.conf

#Testroutine,
local0.=notice                             -/dev/tty1  

Nun überwachen wir unser Programm welches wir den Typen LOG_LOCAL0 geben. Erkennt syslog die Priorität LOG_NOTICE, gibt das Programm einen Text auf das Terminal /dev/tty1 aus (vorausgesetzt sie haben dies auch am laufen (STRG+ALT+F1)). Natürlich sollten sie im Falle eine Nachricht nicht jede Nachricht auf dem Bildschirm ausgeben. Idealer wäre in diesem Fall die Nachricht ebenfalls in einer Log-Datei zu schreiben. Je nach Priorität der Nachricht. Wie sie die syslog.conf - Datei dementsprechend konfigurieren entnehmen sie bitte aus der man-Pages zu syslogd. Hier nun unser Programm.......

/*Download:slog.c*/
#include <stdio.h> #include <unistd.h> #include <syslog.h> int main(int argc, char **argv) { openlog("test2", LOG_PID | LOG_CONS, LOG_LOCAL0); syslog(LOG_NOTICE, "Hallo Welt mit syslog\n"); closelog(); return 0; }

Starten sie den syslog - Dämon neu, damit die Konfiguration in syslog.conf übernommen wird. Die können sie am besten durch einen Neustart des Systems erreichen.

Von wo sie das Programm starten ist eigentlich egal, wichtig ist nur das sie mal in das Terminal /dev/tty0 schauen und natürlich auch dort eingeloggt haben. Dort wird nun der Text mit mit dem Programmnamen und der PID ausgeben......

Datum Uhrzeit test2[12345] Hallo Welt mit syslog  

Mit....

syslog(LOG_NOTICE, "Hallo Welt mit syslog\n");  

..aktivieren wir praktisch den syslog - Dämon und er tut seine Pflicht. Dies Programm dient natürlich nur zu Testzwecken, damit sie sehen wie sie einzelnen Programme überwachen können, und Meldungen in eine Logdatei oder auf dem Bildschirm ausgeben können. Anstatt auf /dev/tty1 sollten sie wegen der Probleme mit der Pufferung eher auf /dev/xconsole die Meldung ausgeben. Merh dazu unter man xconsole

In Praxis kann uns das System Loggin auf der Suche nach Fehlern in Programmen sehr helfen. Versuchen sie mal in einem Umfangreichen Programm eine eigene Login-Routine einzubauen. Sie werden sehen das sie mit einer Ausgabe von Syslog das ganze viel einfacher bewerkstelligen können. Wir können zum Beispiel überwachen wer gerade wann auf ein bestimmtes Programm zugreift.......

 openlog("myprogramm", LOG_PID | LOG_CONS, LOG_LOCAL0);

 if( (strcmp(nam1,login)) == 0)
   syslog(LOG_NOTICE, "King hat sich gerade eingeloggt");
 else if( (strcmp(nam2,login)) == 0)
   syslog(LOG_NOTICE, "Kong hat sich gerade eingeloggt");  

Wo sie das einlesen hängt immer ab von Ihrer Konfiguration in syslog.conf
Bedenken sie aber, wenn sie es auf dem Bildschirm ausgeben, wer das eventuell auch lesen könnte. Linux selber gibt normalerweise Nachrichten auf dem Bildschirm nur mit allerhöchster Priorität aus.

Natürlich können den syslog - Dämon auch für eigene Dämonen verwenden. Wie sie eigene Dämonen erstellen, erfahren sie im nächsten Kapitel.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf