Modifica 02/06/2016
Se stai cercando di trovare "Messaggi di registro di avvio" in generale, seleziona /var/log/upstart/
. Ecco dove Upstart salva stdout
e stderr
dai servizi Upstart. Grazie alla risposta di leopd per averlo sottolineato.
Se stai cercando messaggi di log da Upstart stesso, che sono configurati initctl log-priority
e emessi da initctl emit
, continua a leggere!
Versione breve
Le voci del registro dovrebbero effettivamente apparire in dmesg. Nonostante ciò, non vengono visualizzati per impostazione predefinita in /var/log
.
Se vuoi inserirli /var/log
anche tu , aggiungi $KLogPermitNonKernelFacility on
alla configurazione di rsyslogd. Suggerisco di creare un file personalizzato come /etc/rsyslog.d/60-custom.conf
per evitare la modifica /etc/rsyslog.conf
, poiché è gestito da dpkg. Ora i messaggi di Upstart dovrebbero comparire in /var/log/syslog
, una volta impostati gli Upstart log-priority
a info
circa.
Versione lunga
Mi ci sono voluti giorni per rintracciarlo, ma apparentemente Upstart (1.5) non accede a syslog, cioè non chiama la funzione glibc syslog()
. Invece, Upstart accede al buffer dell'anello del kernel, che è ciò che legge dmesg. Ora, non pensavo fosse possibile per i processi dello spazio utente scrivere su quel buffer, ma a quanto pare possono farlo scrivendo su /dev/kmsg
, ed è esattamente quello che fa Upstart. Quindi questa è la prima parte del puzzle.
La seconda parte è che c'è una convinzione diffusa che i messaggi scritti nel buffer dell'anello del kernel vengano automaticamente copiati nel syslog dal kernel (almeno è quello che ho sempre pensato). Si scopre che questo è effettivamente fatto da un demone dello spazio utente, tradizionalmente klogd, che opera in tandem con syslogd. Ovviamente rsyslogd sostituisce syslogd ma apparentemente sostituisce anche klogd (sorta di: vedi note alla fine).
La terza parte è che i messaggi scritti nel buffer dell'anello del kernel dallo spazio utente in realtà sembrano diversi dai messaggi scritti dallo spazio del kernel: hanno una funzione diversa. dmesg ha alcune opzioni che interagiscono con questo: -x
mostrerà la funzione (e la priorità), mentre -u
e -k
dirà a dmesg di mostrare solo i messaggi della funzione utente e i messaggi della struttura del kernel, rispettivamente.
Ora ecco il clincher: per impostazione predefinita, rsyslogd ignora i messaggi con una funzione non kernel quando legge i messaggi dal buffer dell'anello del kernel. L'opzione di configurazione pertinente è $KLogPermitNonKernelFacility
, che è disattivata per impostazione predefinita e deve essere attivata se si desidera che rsyslogd elabori questi messaggi. Si noti che il resto della configurazione di rsyslogd tratterà tutti i messaggi dal buffer dell'anello del kernel come aventi la kern
funzione, indipendentemente dalla funzione che avevano nel buffer dell'anello del kernel.
Maggiori informazioni
syslog
Il codice può scrivere su syslog chiamando la funzione glibc syslog()
, descritta in man 3 syslog
. Apparentemente queste funzioni scrivono a /dev/log
. Il codice può leggere da syslog leggendo /dev/log
, e questo è ciò che fanno syslogd
e le sue sostituzioni. rsyslogd
legge /dev/log
usando il suo imuxsock
modulo di input.
Buffer dell'anello del kernel
Lo spazio del kernel scrive su questo buffer chiamando la funzione kernel printk()
, quindi a volte viene chiamato buffer printk. Lo spazio utente può scrivergli scrivendo su /dev/kmsg
. Lo spazio utente può leggere da questo buffer con diversi metodi: può leggere da /proc/kmsg
(cosa fa di default dmesg), oppure può leggere /dev/kmsg
o può chiamare la chiamata di sistema syslog()
, che è descritta in man 2 syslog
ed è completamente diversa dalla funzione glibc syslog()
descritta in man 3 syslog
. glibc in realtà fornisce un wrapper alla chiamata di sistema syslog()
, chiamato klogctl()
, per aiutare ad alleviare questa confusione.
Tradizionalmente, klogd
legge da una di queste interfacce, quindi chiama la funzione glibc syslog()
per copiarle nel syslog. rsyslogd legge una di queste interfacce attraverso il suo imklog
modulo di input ma AFAIK non si preoccupa di chiamare glibc syslog()
, motivo per cui non è esattamente come klogd; elabora semplicemente l'output imklog
esattamente come elabora l'output da qualsiasi altro modulo di input. C'è l'ulteriore avvertimento che tutto l' imklog
output ha la kern
funzione indipendentemente dal messaggio della struttura nel buffer dell'anello del kernel.
Riferimenti
dmesg
ma non ha senso senza il contesto qui indicato.