Bearbeiten 02.06.2016
Wenn Sie im Allgemeinen versuchen, "Upstart-Protokollmeldungen" zu finden, aktivieren Sie diese Option /var/log/upstart/
. Hier speichert Upstart stdout
und stderr
von Upstart-Diensten. Vielen Dank an leopd's Antwort für den Hinweis.
Wenn Sie nach Protokollmeldungen von Upstart selbst suchen, die von konfiguriert initctl log-priority
und ausgegeben werden initctl emit
, lesen Sie weiter!
Kurze Version
Die Protokolleinträge sollten tatsächlich in dmesg angezeigt werden. Trotzdem werden sie nicht standardmäßig in angezeigt /var/log
.
Wenn Sie sie auch möchten /var/log
, fügen Sie sie $KLogPermitNonKernelFacility on
zur Konfiguration von rsyslogd hinzu. Ich schlage vor, eine benutzerdefinierte Datei /etc/rsyslog.d/60-custom.conf
zu erstellen , um eine Bearbeitung zu vermeiden /etc/rsyslog.conf
, da dies von dpkg verwaltet wird. Jetzt sollten Upstart-Meldungen in angezeigt werden /var/log/syslog
, sobald Sie Upstarts log-priority
auf info
oder so eingestellt haben.
Lange Version
Das hat Tage gedauert, aber anscheinend meldet sich Upstart (1.5) nicht bei syslog an, das heißt, es ruft nicht die glibc-Funktion auf syslog()
. Stattdessen protokolliert Upstart im Kernel-Ringpuffer, was dmesg liest. Nun, ich dachte nicht, dass es für User-Space-Prozesse möglich ist , in diesen Puffer zu schreiben, aber anscheinend können sie dies durch Schreiben /dev/kmsg
, und genau das macht Upstart. Das ist also der erste Teil des Puzzles.
Der zweite Teil ist, dass es eine weit verbreitete Überzeugung gibt, dass Nachrichten, die in den Kernel-Ringpuffer geschrieben wurden, vom Kernel automatisch in Syslog kopiert werden (zumindest dachte ich das immer). Es stellt sich heraus, dass dies tatsächlich von einem User Space Daemon (traditionell klogd) durchgeführt wird, der zusammen mit syslogd arbeitet. Offensichtlich ersetzt rsyslogd syslogd, aber anscheinend auch klogd (Art: siehe Anmerkungen am Ende).
Der dritte Teil ist, dass Nachrichten, die aus dem Benutzerbereich in den Kernelringpuffer geschrieben werden, tatsächlich anders aussehen als Nachrichten, die aus dem Kernelbereich geschrieben werden: Sie haben eine andere Funktion. dmesg hat ein paar Optionen , die interact mit diesem: -x
die Anlage zeigen wird (und der Priorität), während -u
und -k
dmesg sagen nur Benutzereinrichtungsnachrichten und Kernel - Anlage Nachrichten anzuzeigen sind.
Hier ist der Drahtreifen: Standardmäßig ignoriert rsyslogd Nachrichten mit einer Nicht-Kernel-Funktion, wenn Nachrichten aus dem Kernel-Ringpuffer gelesen werden. Die entsprechende Konfigurationsoption ist $KLogPermitNonKernelFacility
standardmäßig deaktiviert und muss aktiviert werden, wenn rsyslogd diese Nachrichten verarbeiten soll. Beachten Sie, dass der Rest der Konfiguration von rsyslogd alle Nachrichten aus dem Kernel-Ringpuffer als mit der kern
Einrichtung versehen behandelt, unabhängig von der Einrichtung, die sie im Kernel-Ringpuffer hatten.
Mehr Informationen
Syslog
Code kann durch Aufrufen der syslog()
in beschriebenen Funktion glibc in syslog schreiben man 3 syslog
. Anscheinend schreiben diese Funktionen an /dev/log
. Code kann durch Lesen aus dem Syslog gelesen werden /dev/log
, und dies syslogd
und seine Ersetzungen tun dies. rsyslogd
liest /dev/log
mit seinem imuxsock
Eingabemodul.
Kernel-Ringpuffer
Der Kernel-Speicherplatz schreibt in diesen Puffer, indem er die Kernel-Funktion printk()
aufruft. Daher wird er manchmal als Printk-Puffer bezeichnet. Der Benutzerraum kann darauf schreiben, indem er darauf schreibt /dev/kmsg
. Der Benutzerraum kann mit verschiedenen Methoden aus diesem Puffer lesen: Er kann auslesen /proc/kmsg
(was dmesg standardmäßig tut), oder er kann auslesen /dev/kmsg
, oder er kann den Systemaufruf aufrufen syslog()
, der in der beschriebenen glibc-Funktion beschrieben ist man 2 syslog
und sich vollständig von dieser unterscheidetsyslog()
in man 3 syslog
. glibc stellt dem Systemaufruf syslog()
, der aufgerufen wird klogctl()
, einen Wrapper zur Verfügung , um diese Verwirrung zu lindern.
klogd
Liest traditionell von einer dieser Schnittstellen und ruft dann die Funktion glibc syslog()
auf, um sie in das Syslog zu kopieren. rsyslogd liest eine dieser Schnittstellen über sein imklog
Eingabemodul, aber AFAIK kümmert sich nicht darum, die glibc aufzurufen syslog()
, weshalb es nicht genau wie klogd ist. Es verarbeitet nur die Ausgabe von imklog
genauso wie die Ausgabe von jedem anderen Eingabemodul. Es gibt die zusätzliche Einschränkung, dass alle imklog
Ausgaben die Funktion haben kern
, unabhängig davon, welche Funktionsnachrichten sich im Kernel-Ringpuffer befinden.
Verweise
dmesg
ergab ohne den hier gegebenen Kontext keinen Sinn.