Start   Impressum   Lizenz         online lesen   Download         Online-Shop   Jumping Blue Turtle

Debian für Unternehmer - Debian-Know-how

1260: Log-Meldungen des Kernels

Der Kernel schreibt alles das, was er tut, mit. Die Log-Meldungen können an verschiedenen Stellen und in verschiedenen Detailstufen ausgegeben werden.

ACHTUNG! Die in Debian Etch existierende Datei "/etc/syslog.conf" heißt in Debian Lenny nun "/etc/rsyslog.conf"! Das Ganze hat auch einen Hintergrund. Den werde ich bald hier einfließen lassen. Bis dahin nehmen Sie bitte diesen Hinweis zur Kenntnis und improvisieren entsprechend.

1. Technische Grundlagen

Bevor wir irgendetwas mit den Log-Meldungen des Kernels machen, beschäftigen wir uns zunächst mit den technischen Grundlagen. Die erste wichtige Erkenntnis ist die, dass es spezielle man-Pages für Kernel-Entwickler gibt. Auf eine davon verweist die man-Page von "proc". Die Eingabe von

apt-cache search manpages-dev

führt zu folgender Ausgabe:

manpages-dev - Manual pages about using GNU/Linux for development

Installieren wir also diese man-Pages, um etwas darin zu lesen:

apt-get install manpages-dev

Interessant ist nun der Abschnitt 2 der man-Page http://www.rt.com/man/syslog.2.html, offline nachlesbar mit diesem Befehl:

man 2 syslog

Eine wirklich interessante Liste in dieser man-Page bringt erste Erkenntnisse zu den Detailstufen der Log-Meldungen ans Tageslicht:

#define KERN_EMERG    "<0>"  /* system is unusable               */
#define KERN_ALERT    "<1>"  /* action must be taken immediately */
#define KERN_CRIT     "<2>"  /* critical conditions              */
#define KERN_ERR      "<3>"  /* error conditions                 */
#define KERN_WARNING  "<4>"  /* warning conditions               */
#define KERN_NOTICE   "<5>"  /* normal but significant condition */
#define KERN_INFO     "<6>"  /* informational                    */
#define KERN_DEBUG    "<7>"  /* debug-level messages             */

Das heißt: Jeder Log-Meldung, die vom Kernel generiert wird, wird eine Detailstufe bzw. ein Log-Level zugewiesen. Das Log-Level betrachten wir dabei als umgekehrt proportional zur Detailstufe. Drei Beispiele:

  • Emergency: Eine Log-Meldung mit dem Log-Level 0 hat das höchste Log-Level (die höchste Priorität, verdient höchste Aufmerksamkeit), aber die niedrigste Detailstufe. Eine Liste, die nur aus Log-Meldungen mit Detailstufe=0 besteht, sagt sehr wenig über das laufende System aus. Es informiert höchstens darüber, ob fatale Fehler vorliegen, und wenn ja, welche das sind.
  • Warning: Eine Log-Meldung mit dem Log-Level 4 hat ein mittleres Log-Level (eine mittlere Priorität, verdient mittlere Aufmerksamkeit) und dementsprechend eine mittlere Detailstufe. Eine Liste, die aus Log-Meldungen mit den Detailstufen 0, 1, 2, 3 und 4 besteht, sagt so viel über das laufende System aus, dass zu erkennen ist, welche Fehler und welche Warnungen entstanden sind. Probleme und potentielle Probleme können in dieser Detailstufe gut erkannt werden.
  • Debug: Eine Log-Meldung mit dem Log-Level 7 hat das niedrigste Log-Level (die niedrigste Priorität, verdient niedrigste Aufmerksamkeit), aber die höchste Detailstufe. Eine Liste, die aus Log-Meldungen mit den Detailstufen von 0 bis 7 besteht, enthält ALLE Log-Meldungen, die der Kernel generiert und sagt alles über das laufende System aus, was irgendwie interessant sein könnte. Mit Hilfe der Debug-Meldungen können Programmierer das System auf jedes erdenkliche Detail hin untersuchen. Es sollte damit gerechnet werden, dass in dieser höchsten Detailstufe pro Sekunde mehrere Log-Meldungen generiert werden können und daraus resultierende Listen sehr lang werden können.

2. Log-Meldungen in der Konsole

Wenn Systemfehler auftreten (zum Beispiel: eine Festplatte ist kaputt gegangen), dann erscheinen diese Fehler auf den Konsolen (<Alt>+<F1> bis <Alt>+<F6>), damit der Benutzer sofort mitbekommt, dass etwas nicht stimmt. Aber auch Benachrichtigungen, dass ein neues USB-Gerät angesteckt wurde oder dass ein KVM-Switch Tastatur und Maus zwischen dem aktuellen und einem anderen Rechner gewechselt hat, erscheinen auf den Konsolen und zerschießen dann die Ausgaben der Software, die dort eigentlich läuft (z.B. Midnight Commander).

Das kann nerven, und möglicherweise wollen Sie das ändern. Ändern können Sie die Detailstufen der Log-Meldungen in der Konfigurationsdatei "/etc/sysctl.conf". Es gibt dort den passenden Eintrag:

# Uncomment the following to stop low-level messages on console
#kernel.printk = 4 4 1 7

Wenn Sie also das Kommentarzeichen entfernen, und aus der ersten 4 eine 1 machen,

# Uncomment the following to stop low-level messages on console
kernel.printk = 1 4 1 7

dann verschwinden die Log-Meldungen, die durch An- und Abstöpseln von USB-Geräten und durch Betätigen des KVM-Switches ausgelöst werden. Aber, warum? Bevor Sie die Änderung in "/etc/sysctl.conf" abspeichern, sollten Sie zunächst einen Blick in die virtuelle Datei "/proc/sys/kernel/printk" hineinwerfen. Da drin steht:

7       4       1       7

Vor der Änderung der "/etc/sysctl.conf" war die erste der 4 Zahlen eine 7. Nach der Änderung wurde aus der 7 eine 1. Mit dem Befehl

man proc

können Sie herausfinden, was die Zahlen der Variable "printk" im "proc"-Baum bedeutet. Da steht:

/proc/sys/kernel/printk
       The  four values in this file are console_loglevel, default_mes-
       sage_loglevel,    minimum_console_level     and     default_con-
       sole_loglevel.   These  values  influence printk() behavior when
       printing or logging error messages. See syslog(2) for more  info
       on  the  different  loglevels.   Messages with a higher priority
       than console_loglevel will be printed to the console.   Messages
       without  an  explicit  priority  will  be  printed with priority
       default_message_level.  minimum_console_loglevel is the  minimum
       (highest)   value   to   which   console_loglevel  can  be  set.
       default_console_loglevel  is  the   default   value   for   con-
       sole_loglevel.

Übersetzen wir das mal in eine verständliche Sprache. Die Variable "printk" enthält folgende 4 Werte mit den entsprechenden Bedeutungen:

  • console_loglevel: Es werden nur Log-Meldungen auf der Konsole ausgegeben, deren Detailstufe niedriger ist als hier vermerkt.
  • default_message_loglevel: Wenn Meldungen ohne Detailstufe produziert werden, dann wird ihnen die hier vermerkte Detailstufe zugewiesen, bevor mittels "console_loglevel" entschieden wird, ob sie ausgegeben werden.
  • minimum_console_level: Wenn hier eine 1 steht, dann kann "console_loglevel" auf 1 oder größer gesetzt werden, nicht aber auf einen Wert größer als 1 (also nicht auf 0).
  • default_console_loglevel: Das ist der Default-Wert von "console_loglevel". Wenn hier eine 7 steht und bei "console_loglevel" nichts angegeben ist, dann wird "console_loglevel" auf den Default-Wert, also auf 7 gesetzt.

Wir stellen also fest, dass für unsere Belange nur die erste Zahl interessant ist: und zwar "console_loglevel". Die zweite Zahl sollten wir so lassen, wie sie ist. Die letzten beiden Zahlen dürften nur für Kernel-Entwickler interessant sein, wenn sie sinnvolle Defaults festlegen müssen, dabei aber höhere Instanzen entscheiden lassen wollen, ob sie "console_loglevel" explizit setzen wollen oder lieber den Default-Wert nutzen wollen.

Die folgende Liste zeigt, was Sie bekommen, wenn Sie "console_loglevel" auf einen Wert von 0 bis 8 setzen:

  • console_loglevel = 0: Keine Log-Meldungen anzeigen. Ab EMERGENCY (0) ausblenden.
  • console_loglevel = 1: Log-Meldungen mit Log-Level=0 anzeigen. Ab ALERT (1) ausblenden.
  • console_loglevel = 2: Log-Meldungen von 0 bis 1 anzeigen. Ab CRITICAL (2) ausblenden.
  • console_loglevel = 3: Log-Meldungen von 0 bis 2 anzeigen. Ab ERROR (3) ausblenden.
  • console_loglevel = 4: Log-Meldungen von 0 bis 3 anzeigen. Ab WARNING (4) ausblenden.
  • console_loglevel = 5: Log-Meldungen von 0 bis 4 anzeigen. Ab NOTICE (5) ausblenden.
  • console_loglevel = 6: Log-Meldungen von 0 bis 5 anzeigen. Ab INFO (6) ausblenden.
  • console_loglevel = 7: Log-Meldungen von 0 bis 6 anzeigen. Ab DEBUG (7) ausblenden.
  • console_loglevel = 8: Log-Meldungen von 0 bis 7 anzeigen. Nichts ausblenden.

Dabei ist zu beachten, dass das Setzen von "console_loglevel" auf 0 nur theoretisch funktioniert, denn mindestens ist "minimum_console_level" in der Regel auf 1 gesetzt. Auch ein Setzen von "console_loglevel" auf 8 produziert nicht unbedingt auf Anhieb Debug-Meldungen, was wohl daran liegen kann, dass an anderer Stelle das Generieren von Debug-Meldungen unterdrückt wurde, um die System-Performance nicht unnötig zu belasten.

Wenn Sie wollen, dass Meldungen vom KVM-Switch nicht mehr die Konsole verunstalten, dann müssen Sie je nach Rechner "console_loglevel" entweder auf 6 oder auf 4 setzen. Der KVM-Switch verursacht Meldungen vom Typ KERN_INFO (Log-Level 6). Wenn ein Rechner eine gewisse "compaq touchscreen emulation" nicht verträgt (was auch immer das für ein Quatsch sein mag), dann verursacht der KVM-Switch zusätzlich noch Meldungen vom Typ KERN_WARNING (Log-Level 4). Sie sind daher auf der sicheren Seite, wenn Sie alle Log-Meldungen ab Log-Level 4 ausblenden und "console_loglevel" entsprechend auf 4 setzen.

Wenn Sie wollen, dass auch Meldungen von USB-Massenspeichern die Konsole nicht verunstalten, dann müssen Sie "console_loglevel" sogar noch niedriger setzen, zum Beispiel auf 3, um unsinnig priorisierte Fehlermeldungen der Sorte "sdb: assuming drive cache: write through" auszublenden.

Meine Empfehlung ist, "console_loglevel" auf 1 zu setzen, damit auf der Konsole Ruhe ist. Nur noch Log-Meldungen vom Typ EMERGENCY können dann noch die Konsole verunstalten. Auf einem System, das unbenutzbar ist, ist das aber nicht so tragisch.

Übrigens: Sie können die Werte der Variablen auch in "/proc/sys/kernel/printk" direkt ändern:

echo '1 4 1 7' > /proc/sys/kernel/printk

Die Änderungen sind aber nicht persistent (von Dauer). Beim nächsten Reboot wird dort wieder der Wert von "/etc/sysctl.conf" stehen.

3. Log-Meldungen auf Konsole 10 und 11

Es kann ganz praktisch sein, die Log-Meldungen auf eine Konsole zu leiten, die extra für Log-Meldungen eingerichtet wurde. Dazu nutzen wir jetzt die Datei "/etc/syslog.conf".

Verantwortlich für die Ausgabe der Log-Meldungen an verschiedene Ziele ist der Daemon "syslogd". Nachlesen können Sie dessen Konfiguration mit einem der beiden Befehle:

man syslog.conf
man 5 syslog.conf

Die Datei "/etc/syslog.conf" enthält mehrere sogenannte "Rules". Eine Rule ist eine Konfigurationsangabe, die vereinfacht gesagt angibt, was wohin geschrieben werden soll.

3.1. Aufbau einer Rule

Eine Rule besteht aus zwei Feldern, also aus einem Selector und einer Action, die durch Leerzeichen oder Tabs voneinander getrennt sind, und sieht entsprechend so aus:

selector action
3.2. Aufbau eines Selectors

Ein Selector besteht wiederum aus einer Facility, gefolgt von einem Punkt, gefolgt von einer Priority. Entsprechend sieht eine Rule so aus:

facility.priority action
3.3. Was bedeuten die einzelnen Komponenten?

Die folgende Liste zeigt, was die einzelnen Komponenten bedeuten:

  • Facility: Die Facility sagt aus, welche Art von Programm die Log-Meldung produziert hat. Die "/etc/syslog.conf" kann so festlegen, dass Log-Meldungen von unterschiedlichen Quellen unterschiedlich gehandhabt werden können.
  • Priority: Die Priority entspricht dem Log-Level, also der Detailstufe einer Log-Meldung.
  • Action: Die Action enthält eine Angabe, aus der hervorgeht, was mit der Log-Meldung passieren soll, also wo sie hingeschrieben werden soll.
3.4. Kombination und Verteilung

Mehrere Facilities können per Komma getrennt aufgelistet werden:

facility1,facility2,facility3.priority action

Mehrere Selectors können per Semikolon getrennt aufgelistet werden:

facility1a,facility1b.priority1;facility2a,facility2b.priority2 action

Eine Rule kann auf mehrere Zeilen verteilt werden, wenn zwischen zwei Selectors statt eines Semikolons nacheinander ein Semikolon, ein Backslash, ein Zeilenumbruch und Leerzeichen oder Tabs stehen. Dabei ist zu beachten, dass ohne Verwendung von Backslashs keine Leerzeichen zwischen den Selectors stehen dürfen, vor den Backslashs keine Leerzeichen stehen dürfen und die Backslash-Konstruktion nur zwischen Selectors, aber nirgendwo sonst funktioniert. Ein Beispiel:

facility1a,facility1b.priority1;\
  facility2a,facility2b.priority2; action

So nicht:

facility1a,facility1b.priority1; \
facility2a,facility2b.priority2; \
  action

Beachten Sie bitte, dass Priorities NICHT per Komma getrennt aufgelistet werden können. Eine solche Rule ist falsch und wird daher ignoriert:

facility.priority1,priority2,priority3 action

3.5. Mögliche Angaben für Facility

Unter anderem sind folgende Schlüsselwörter für die Facility möglich:

auth, authpriv, cron, daemon, ftp, kern, lpr, mail, mark, news,
syslog, user, uucp, local0, local1, local2, local3, local4,
local5, local6, local7

Was diese Facilities bedeuten, das können Sie hier nachlesen:

man syslog

Ein Stern ("*") steht für alle Facilities.

3.5. Mögliche Angaben für Priority

Unter anderem sind folgende Schlüsselwörter für die Priority möglich:

emerg, alert, crit, err, warning, notice, info, debug

Eine "Kernel-Panic", wie sie früher existierte, wäre heute ein "Kernel-Emergency", da das Schlüsselwort "emerg" das Schlüsselwort "panic" abgelöst hat.

Ein Stern ("*") steht für alle Priorities.

Wenn eine Priority angegeben wurde, dann sind damit alle Log-Meldungen gemeint mit dieser Detailstufe und allen niedrigeren. Beispiel: Ein "err" steht für "emerg", "alert", "crit" und "err".

Wenn vor die Priority ein "=" gesetzt wird, dann ist damit explizit die angegebene Detailstufe gemeint. Beispiel: Ein "=err" steht für ein "err", für nicht mehr und nicht weniger.

Ein "!" negiert das, was nach ihm folgt. Beispiel: Ein "!=err" steht für alles außer ein "err". Ein "!err" steht für "warning", "notice", "info" und "debug".

Ein "!*" oder ein "none" veranlasst, dass gar keine Log-Meldungen verarbeitet werden.

3.6. Mögliche Angaben für Action

Als Angaben für die Action kommen folgende Möglichkeiten in Frage:

  • reguläre Dateien
  • Named Pipes
  • Terminals und Konsolen
  • ein anderer Rechner (Remote Machine)
  • eine Liste von Usern
  • jeder User, der gerade eingeloggt ist (einen Stern verwenden, also "*")

Wenn die Action eine Datei ist und vor dem Dateinamen ein Minus ("-") steht, dann heißt das, dass nach dem Schreiben der Log-Meldung in die Datei der Cache dieser Datei nicht sofort auf die Festplatte geschrieben wird, um Performance zu sparen (die Informationen verbleiben physikalisch im RAM und der logische Dateiinhalt wird dann auf die Festplatte geschrieben, wenn das System sowieso gerade Leerlaufzeiten hat). Es besteht das Risiko, dass neue Log-Meldungen verloren gehen, wenn das System zeitlich zwischen dem logischen und dem physikalischen Schreiben abstürzt.

3.7. Beispiel-Rules

Nachdem wir in die Materie eingetaucht sind, konstruieren wir aus den Komponenten nun die ersten Rules, um das alles besser zu verstehen.

Die folgende Rule sendet alle Kernel-Log-Meldungen in die Datei "/var/log/messages-test1" unter Verwendung eines Schreib-Caches:

kern.* -/var/log/messages-test1

Diese Rule sendet alle Kernel-Log-Meldungen mit einem Log-Level ab "crit" in die Datei "/var/log/messages-test2" ohne Schreib-Cache, also sofort und damit einigermaßen geschützt vor Datenverlust:

kern.crit /var/log/messages-test2

Diese Rule sendet alle Log-Meldungen, die es gibt in die Datei "/var/log/messages-test3" unter Verwendung eines Schreib-Caches:

*.* -/var/log/messages-test3

Diese Rule sendet Log-Meldungen mit den Priorities "err" und "warning" von allen Facilities, mit Ausnahme des Kernels, in die Datei "/var/log/messages-test4" unter Verwendung eines Schreib-Caches:

*.err;*.warning;kern.none -/var/log/messages-test4

Das Gleiche noch einmal, nur über mehrere Zeilen verteilt:

*.err;\
  *.warning;\
  kern.none -/var/log/messages-test5
3.8. Lösungsansatz

Sie wissen jetzt alles, was Sie benötigen, um die Log-Ausgaben zu konstruieren, die Sie sehen möchten. Um die Log-Ausgaben auf die Funktionstaste F10 zu legen, können Sie in der Datei "/etc/syslog.conf" den folgenden vorhandenen Absatz auskommentieren und abändern:

#
# I like to have messages displayed on the console, but only on a virtual
# console I usually leave idle.
#
#daemon,mail.*;\
#       news.=crit;news.=err;news.=notice;\
#       *.=debug;*.=info;\
#       *.=notice;*.=warn       /dev/tty8

Das empfehle ich aber nicht, weil eine solche Rule sicherlich sinnvoller aufgeschrieben werden kann, ohne Ballast aus dem letzten Jahrhundert.

Folgende Rules empfehle ich:

# eigene Rules 01
*.* /dev/tty10
*.err /dev/tty11
kern.err /dev/tty12

Mit diesen Rules bekommen Sie alle existierenden Log-Meldungen auf die Konsole 10, alle Log-Meldungen mit einer Detailstufe kleiner/gleich 3 auf die Konsole 11 und alle Kernel-Log-Meldungen mit einer Detailstufe kleiner/gleich 3 auf die Konsole 12.

3.9. Hinweis

Wenn Sie die Ausgabe der Log-Meldungen in die aktuelle Konsole (per "/etc/sysctl.conf") nicht unterdrückt haben, dann müssen Sie beim Betrachten der Konsolen 10 bis 12 damit rechnen, dass während der Betrachtung Meldungen doppelt in der gerade offenen Konsole erscheinen! Einmal erscheint sie, weil sie in die aktuelle Konsole ausgegeben wurde und ein weiteres mal, weil sie in die Konsole ausgegeben wurde, die Sie zufällig gerade betrachten.

4. Log-Files

Zusätzlich zu "/var/log/messages", "/var/log/debug" und den anderen Log-Files, können Sie sich noch eigene Log-Files anlegen:

# eigene Rules 02
*.crit /var/log/meldungen

5. Web-Links