L'altra risposta spiega, come dice l'autore, la "registrazione classica" in Linux. Al giorno d'oggi non è così che funzionano le cose in molti sistemi.
Il nocciolo
I meccanismi del kernel sono cambiati.
Il kernel genera l'output in un buffer in memoria. I software applicativi possono accedervi in due modi. Il sottosistema di registrazione di solito accede ad esso come uno pseudo-FIFO denominato /proc/kmsg
. Questa fonte di informazioni sui registri non può essere utilmente condivisa tra i lettori di registri, poiché è di sola lettura. Se più processi lo condividono, ognuno ottiene solo una parte del flusso di dati del registro del kernel. È anche di sola lettura.
L'altro modo per accedervi è il /dev/kmsg
dispositivo personaggio più recente . Questa è un'interfaccia di lettura-scrittura condivisibile tra più processi client. Se più processi lo condividono, leggono tutti lo stesso flusso di dati completo, non influenzati l'uno dall'altro. Se lo aprono per l'accesso in scrittura, possono anche iniettare messaggi nel flusso di log del kernel, come se fossero stati generati dal kernel.
/proc/kmsg
e /dev/kmsg
fornire i dati di registro in un formato non RFC-5424.
applicazioni
Le applicazioni sono cambiate.
La syslog()
funzione della libreria GNU C nei principali tentativi di connettersi a un AF_LOCAL
socket di datagramma denominato /dev/log
e scrivere voci di registro su di esso. (La syslog()
funzione della libreria BSD C al giorno d'oggi utilizza /var/run/log
come nome socket e prova per /var/run/logpriv
prima.) Le applicazioni possono ovviamente avere il proprio codice per farlo direttamente. Dopotutto, la funzione di libreria è solo il codice (per aprire, connettersi, scrivere e chiudere un socket) in esecuzione nel contesto del processo stesso dell'applicazione.
Le applicazioni possono anche inviare messaggi RFC 5424 tramite UDP a un server RFC 5426 locale, se uno è in ascolto su un socket AF_INET
/ AF_INET6
datagram sulla macchina.
Grazie alla pressione del mondo dei demoni nel corso degli ultimi due decenni, molti demoni supportano l'esecuzione in una modalità in cui non usano la syslog()
funzione di libreria GNU C o socket UDP, ma sputano i loro dati di registro in errori standard nel ordinaria moda Unix.
gestione dei tronchi con nosh e la famiglia dei daemontools in generale
Con la famiglia di set di strumenti daemontools c'è molta flessibilità nella registrazione. Ma in generale in tutta la famiglia l'idea è che ogni demone "principale" ha un demone "logging" associato. i demoni "principali" funzionano esattamente come i processi non demoni e scrivono i loro messaggi di log in errori standard (o output standard), che il sottosistema di gestione del servizio organizza per essere collegati tramite una pipe (che mantiene aperti in modo da non perdere i dati del log un riavvio del servizio) nell'input standard del demone "logging".
Tutti i demoni "logging" eseguono un programma che registra da qualche parte . Generalmente questo programma è qualcosa di simile multilog
o cyclog
che legge dal suo input standard e scrive i file di registro (con timestamp di nanosecondi) in una directory strettamente limitata, ruotata automaticamente, di scrittura esclusiva. In generale, anche questi demoni corrono sotto l'egida di singoli account utente non privilegiati dedicati.
Quindi si finisce con un sistema di registrazione ampiamente distribuito, con i dati di registro di ciascun servizio elaborati separatamente.
Si può eseguire qualcosa di simile klogd
o syslogd
o rsyslogd
sotto una gestione dei servizi della famiglia demoniols. Ma il mondo dei demonoli ha capito molti anni fa che la struttura di gestione dei servizi con demoni "logging" si presta abbastanza bene a fare le cose in modo più semplice. Non è necessario eseguire il fan tutti i flussi di log in un gigantesco mish-mash, analizzare i dati del log e quindi eseguire il fan out dei flussi in file di log separati; e quindi (in alcuni casi) imbullonare un meccanismo di rotazione del registro esterno inaffidabile sul lato. La struttura della famiglia dei daemontools come parte della sua gestione dei log standard fa già la rotazione del log, la scrittura del file di log e la separazione del flusso.
Inoltre: il modello di caricamento a catena dei privilegi di rilascio con strumenti comuni a tutti i servizi significa che i programmi di registrazione non hanno bisogno di privilegi di superutente; e il modello UCSPI significa che devono solo preoccuparsi delle differenze come il flusso rispetto ai trasporti di datagrammi.
Il set di strumenti nosh ne è un esempio. Mentre uno può essere eseguito rsyslogd
sotto di esso, fuori dalla scatola, e gestire semplicemente il kernel /run/log
e l'input del log UDP alla vecchia maniera; ma anche fornisce più modi "daemontools nativi" di logging queste cose:
- un
klogd
servizio che legge /proc/kmsg
e scrive semplicemente quel flusso di log nel suo errore standard. Questo viene fatto da un semplice programma chiamato klog-read
. Il dæmon di registrazione associato alimenta il flusso di registro sul suo input standard in una /var/log/sv/klogd
directory di registro.
- un
local-syslog-read
servizio che legge datagrammi da /dev/log
( /run/log
sui BSD) e scrive semplicemente quel flusso di log nel suo errore standard. Questo viene fatto da un programma chiamato syslog-read
. Il dæmon di registrazione associato alimenta il flusso di registro sul suo input standard in una /var/log/sv/local-syslog-read
directory di registro.
- un
udp-syslog-read
servizio in ascolto sulla porta syslog di UDP, legge ciò che gli viene inviato e scrive semplicemente quel flusso di log nel suo errore standard. Ancora una volta, il programma è syslog-read
. Il dæmon di registrazione associato alimenta il flusso di registro sul suo input standard in una /var/log/sv/udp-syslog-read
directory di registro.
- (sui BSD) un
local-priv-syslog-read
servizio che legge datagrammi /run/logpriv
e scrive semplicemente quel flusso di log nel suo errore standard. Ancora una volta, il programma è syslog-read
. Il dæmon di registrazione associato alimenta il flusso di registro sul suo input standard in una /var/log/sv/local-priv-syslog-read
directory di registro.
Il set di strumenti include anche uno export-to-rsyslog
strumento in grado di monitorare una o più directory di registro (utilizzando un sistema di cursori di registro non intrusivo ) e inviare nuove voci in formato RFC 5424 attraverso la rete a un server RFC 5426 designato.
gestione dei log con systemd
systemd ha un unico programma di gestione dei log monolitico, systemd-journald
. Questo funziona come un servizio gestito da systemd.
- Legge i
/dev/kmsg
dati di registro del kernel.
- Legge
/dev/log
(un collegamento simbolico a /run/systemd/journal/dev-log
) per i dati del registro dell'applicazione dalla syslog()
funzione della libreria GNU C.
- Ascolta il
AF_LOCAL
socket del flusso su /run/systemd/journal/stdout
per i dati di registro provenienti dai servizi gestiti da systemd.
- Ascolta sul
AF_LOCAL
socket del datagramma i /run/systemd/journal/socket
dati di registro provenienti da programmi che parlano il protocollo journal specifico del sistema (es. sd_journal_sendv()
Et al.).
- Mescola tutti insieme.
- Scrive su un set di file journal a livello di sistema e per utente, in
/run/log/journal/
o /var/log/journal/
.
- Se è in grado di connettersi (come client) a un
AF_LOCAL
socket di datagramma /run/systemd/journal/syslog
, scrive lì i dati del diario, se è configurato l'inoltro a syslog.
- Se configurato, scrive i dati del journal nel buffer del kernel usando il
/dev/kmsg
meccanismo scrivibile .
- Se configurato, scrive i dati del diario sui terminali e anche sul dispositivo console.
Le cose brutte accadono a livello di sistema se questo programma si arresta in modo anomalo o il servizio viene arrestato.
systemd stesso organizza che gli output standard e gli errori di (alcuni) servizi siano collegati al /run/systemd/journal/stdout
socket. Quindi i demoni che registrano l'errore standard nel modo normale vengono inviati al diario.
Ciò soppianta completamente klogd, syslogd, syslog-ng e rsyslogd.
Questi devono ora essere specifici del sistema. Su un sistema systemd non diventano la fine del server /dev/log
. Invece, adottano uno dei due approcci:
- Arrivano a essere la fine del server
/run/systemd/journal/syslog
, che (se ricordi) systemd-journald
tenta di connettersi e scrivere i dati del diario. Un paio di anni fa, si sarebbe configurato il imuxsock
metodo di input di rsyslogd per farlo.
- Leggono direttamente dal journal di systemd, utilizzando una libreria specifica per systemd che comprende il formato del journal binario e che può monitorare i file journal e la directory per l'aggiunta di nuove voci. Oggi si configura il
imjournal
metodo di input di rsyslogd per farlo.