Die andere Antwort erklärt, wie der Autor sagt, "klassische Protokollierung" unter Linux. So funktioniert das heutzutage in vielen Systemen nicht mehr.
Der Kernel
Die Kernelmechanismen haben sich geändert.
Der Kernel generiert eine Ausgabe in einen In-Memory-Puffer. Anwendungssoftware kann auf zwei Arten darauf zugreifen. Das Protokollierungssubsystem greift normalerweise als benanntes Pseudo-FIFO darauf zu /proc/kmsg
. Diese Quelle von Protokollinformationen kann nicht für Protokollleser verwendet werden, da sie nur einmal gelesen werden. Wenn mehrere Prozesse es gemeinsam nutzen, erhält jeder nur einen Teil des Kernel-Protokolldatenstroms. Es ist auch schreibgeschützt.
Die andere Möglichkeit, darauf zuzugreifen, ist das neuere /dev/kmsg
Zeichengerät. Dies ist eine Lese- / Schreibschnittstelle, die von mehreren Clientprozessen gemeinsam genutzt werden kann. Wenn mehrere Prozesse es gemeinsam nutzen, lesen sie alle denselben vollständigen Datenstrom, ohne voneinander betroffen zu sein. Wenn sie es für den Schreibzugriff öffnen, können sie auch Nachrichten in den Protokolldatenstrom des Kernels einfügen, als wären sie vom Kernel generiert worden.
/proc/kmsg
und /dev/kmsg
geben Sie Protokolldaten in einer Nicht-RFC-5424-Form an.
Anwendungen
Anwendungen haben sich geändert.
Die syslog()
Hauptfunktion der GNU C-Bibliothek versucht, eine Verbindung zu einem AF_LOCAL
Datagramm-Socket mit dem Namen herzustellen /dev/log
und darin Protokolleinträge zu schreiben. (Die Funktion der BSD C-Bibliothek syslog()
verwendet heutzutage /var/run/log
als Socket-Namen und versucht es /var/run/logpriv
zuerst.) Anwendungen können natürlich ihren eigenen Code haben, um dies direkt zu tun. Die Bibliotheksfunktion ist nur Code (zum Öffnen, Verbinden, Schreiben und Schließen eines Sockets), der im eigenen Prozesskontext der Anwendung ausgeführt wird.
Anwendungen können RFC 5424-Nachrichten auch über UDP an einen lokalen RFC 5426-Server senden, wenn auf dem Computer ein AF_INET
/ AF_INET6
datagram-Socket abgehört wird.
Dank des Drucks der daemontools-Welt in den letzten zwei Jahrzehnten unterstützen viele Daemons die Ausführung in einem Modus, in dem sie nicht die GNU syslog()
C-Bibliotheksfunktion oder UDP-Sockets verwenden, sondern nur ihre Protokolldaten in den Standardfehler ausspucken gewöhnliche Unix-Mode.
Log-Management mit nosh und der daemontools-Familie im Allgemeinen
Mit der Toolset-Familie von daemontools ist die Protokollierung sehr flexibel. Im Allgemeinen ist die Idee für die ganze Familie, dass jedem "Haupt" -Daemon ein "Protokoll" -Daemon zugeordnet ist. "main" -Dämonen arbeiten genau wie Nicht-Dämonen-Prozesse und schreiben ihre Protokollnachrichten in Standardfehler (oder Standardausgabe), die das Service-Management-Subsystem über eine Pipe verbunden hat (die offengehalten wird, damit Protokolldaten nicht verloren gehen) einen Neustart des Dienstes) an die Standardeingabe des "Logging" -Daemon.
Alle "Protokollierungs" -Dämonen führen ein Programm aus, das sich irgendwo protokolliert . Im Allgemeinen ist dieses Programm etwas wie multilog
oder cyclog
dass liest aus der Standardeingabe und schreibt (Nanosekunde timestamped) Protokolldateien in einem strengen Größe bedeckte, automatisch gedreht, exklusiver Schreib, Verzeichnis. Im Allgemeinen laufen diese Dæmons auch alle unter der Ägide einzelner dedizierter nichtprivilegierter Benutzerkonten.
Man hat also ein weitgehend verteiltes Protokollierungssystem, bei dem die Protokolldaten jedes Dienstes separat verarbeitet werden.
Man kann so etwas wie laufen klogd
oder syslogd
oder rsyslogd
unter einem daemontools-Familie Service - Management. Aber die daemontools-Welt hat vor vielen Jahren erkannt, dass sich die Service-Management-Struktur mit "Protokollierungs" -Dämonen sehr gut dazu eignet, Dinge auf einfachere Weise zu erledigen. Es ist nicht erforderlich, alle Protokolldatenströme in einen einzigen Mischmasch zu fächern, die Protokolldaten zu analysieren und die Datenströme dann wieder herauszufächern, um die Protokolldateien zu trennen. und dann (in einigen Fällen) einen unzuverlässigen externen Stammdrehmechanismus an der Seite festschrauben. Die daemontools-Familienstruktur als Teil der Standardprotokollverwaltung führt bereits die Protokollrotation, das Schreiben von Protokolldateien und die Datenstromtrennung durch.
Darüber hinaus bedeutet das Kettenmodell des Verwerfens von Berechtigungen mit allen Diensten gemeinsamen Tools, dass die Protokollierungsprogramme keine Superuser-Berechtigungen benötigen. und das UCSPI-Modell bedeutet, dass sie sich nur um Unterschiede wie Stream- und Datagrammtransport kümmern müssen.
Das nosh-Toolset veranschaulicht dies. Während man kann laufen rsyslogd
unter ihm, aus dem Kasten heraus und verwalten nur Kernel, /run/log
und UDP - log - Eingang in der alten Art und Weise; es auch bietet mehr „daemontools native“ Möglichkeiten, diese Dinge Anmeldung:
- Ein
klogd
Dienst, /proc/kmsg
der diesen Protokolldatenstrom liest und einfach in seinen Standardfehler schreibt. Dies geschieht mit einem einfachen Programm namens klog-read
. Das zugehörige Protokollierungs-Daemon füttert den Protokolldatenstrom bei seiner Standardeingabe in ein /var/log/sv/klogd
Protokollverzeichnis.
- Ein
local-syslog-read
Dienst, der Datagramme aus /dev/log
( /run/log
auf den BSDs) liest und diesen Protokolldatenstrom einfach in seinen Standardfehler schreibt. Dies geschieht durch ein Programm namens syslog-read
. Das zugehörige Protokollierungs-Daemon füttert den Protokolldatenstrom bei seiner Standardeingabe in ein /var/log/sv/local-syslog-read
Protokollverzeichnis.
- Ein
udp-syslog-read
Dienst, der den UDP-Syslog-Port überwacht, liest, was an ihn gesendet wird, und diesen Protokolldatenstrom einfach auf seinen Standardfehler schreibt. Wieder ist das Programm syslog-read
. Das zugehörige Protokollierungs-Daemon füttert den Protokolldatenstrom bei seiner Standardeingabe in ein /var/log/sv/udp-syslog-read
Protokollverzeichnis.
- (Auf den BSDs) Ein
local-priv-syslog-read
Dienst, der Datagramme ausliest /run/logpriv
und diesen Protokolldatenstrom einfach in seinen Standardfehler schreibt. Wieder ist das Programm syslog-read
. Das zugehörige Protokollierungs-Daemon füttert den Protokolldatenstrom bei seiner Standardeingabe in ein /var/log/sv/local-priv-syslog-read
Protokollverzeichnis.
Das Toolset enthält auch ein export-to-rsyslog
Tool, mit dem ein oder mehrere Protokollverzeichnisse überwacht werden können (mithilfe eines Systems von nicht aufdringlichen Protokollcursorn ) und neue Einträge in RFC 5424-Form über das Netzwerk an einen festgelegten RFC 5426-Server gesendet werden können.
Protokollverwaltung mit systemd
systemd verfügt über ein einziges monolithisches Protokollverwaltungsprogramm systemd-journald
. Dies wird als Dienst ausgeführt, der von systemd verwaltet wird.
- Es liest
/dev/kmsg
für Kernel-Protokolldaten.
- Es liest
/dev/log
(ein symbolischer Link zu /run/systemd/journal/dev-log
) für Anwendungsprotokolldaten aus der syslog()
Funktion der GNU C-Bibliothek .
- Es überwacht den
AF_LOCAL
Stream-Socket auf /run/systemd/journal/stdout
Protokolldaten, die von systemd-verwalteten Diensten stammen.
- Er überwacht den
AF_LOCAL
Datagramm-Socket auf /run/systemd/journal/socket
Protokolldaten, die von Programmen stammen, die das systemspezifische Journalprotokoll sprechen (z. B. sd_journal_sendv()
et al.).
- Es mischt diese alle zusammen.
- Es werden systemweite und benutzerspezifische Journaldateien in
/run/log/journal/
oder geschrieben /var/log/journal/
.
- Wenn es sich (als Client) mit einem
AF_LOCAL
Datagramm-Socket verbinden /run/systemd/journal/syslog
kann, schreibt es dort Journaldaten, wenn die Weiterleitung an Syslog konfiguriert ist.
- Wenn konfiguriert, werden Journaldaten mithilfe des beschreibbaren
/dev/kmsg
Mechanismus in den Kernel-Puffer geschrieben .
- Wenn konfiguriert, werden Journaldaten auch auf die Terminals und das Konsolengerät geschrieben.
Systemweit passieren schlimme Dinge, wenn dieses Programm abstürzt oder der Dienst beendet wird.
systemd selbst sorgt dafür, dass die Standardausgaben und Fehler von (einigen) Diensten an den /run/systemd/journal/stdout
Socket angehängt werden. Daher wird die Ausgabe von Dæmons, die auf normale Weise als Standardfehler protokolliert werden, an das Journal gesendet.
Dies ersetzt vollständig klogd, syslogd, syslog-ng und rsyslogd.
Diese müssen nun systemspezifisch sein. Auf einem systemd-System werden sie nicht zum Server-Ende /dev/log
. Stattdessen verfolgen sie einen von zwei Ansätzen:
- Sie werden zum Server-Ende von
/run/systemd/journal/syslog
, auf dem (wenn Sie sich erinnern) systemd-journald
versucht wird, eine Verbindung herzustellen und Journaldaten zu schreiben. Vor ein paar Jahren hätte man dafür die imuxsock
Eingabemethode von rsyslogd konfiguriert .
- Sie lesen direkt aus dem systemd-Journal, wobei sie eine systemd-spezifische Bibliothek verwenden, die das binäre Journalformat versteht und die Journaldateien und das Verzeichnis auf neue Einträge überwachen kann, die hinzugefügt werden. Heutzutage konfiguriert man dazu die
imjournal
Eingabemethode von rsyslogd .