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/kmsgdispositivo 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/kmsge /dev/kmsgfornire 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_LOCALsocket di datagramma denominato /dev/loge scrivere voci di registro su di esso. (La syslog()funzione della libreria BSD C al giorno d'oggi utilizza /var/run/logcome nome socket e prova per /var/run/logprivprima.) 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_INET6datagram 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 multilogo cyclogche 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 klogdo syslogdo rsyslogdsotto 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 rsyslogdsotto di esso, fuori dalla scatola, e gestire semplicemente il kernel /run/loge l'input del log UDP alla vecchia maniera; ma anche fornisce più modi "daemontools nativi" di logging queste cose:
- un
klogdservizio che legge /proc/kmsge 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/klogddirectory di registro.
- un
local-syslog-readservizio che legge datagrammi da /dev/log( /run/logsui 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-readdirectory di registro.
- un
udp-syslog-readservizio 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-readdirectory di registro.
- (sui BSD) un
local-priv-syslog-readservizio che legge datagrammi /run/logprive 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-readdirectory di registro.
Il set di strumenti include anche uno export-to-rsyslogstrumento 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/kmsgdati 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_LOCALsocket del flusso su /run/systemd/journal/stdoutper i dati di registro provenienti dai servizi gestiti da systemd.
- Ascolta sul
AF_LOCALsocket del datagramma i /run/systemd/journal/socketdati 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_LOCALsocket 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/kmsgmeccanismo 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/stdoutsocket. 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-journaldtenta di connettersi e scrivere i dati del diario. Un paio di anni fa, si sarebbe configurato il imuxsockmetodo 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
imjournalmetodo di input di rsyslogd per farlo.