Dove sono i messaggi di registro Upstart su Ubuntu 13.X?


28

Su Ubuntu 12.04, posso trovare i messaggi di registro di Upstart in /var/log/syslog.

comandi:

# initctl log-priority info
# initctl emit hello

log:

Apr  1 01:56:56 precise64 kernel: [ 8365.820425] init: Connection from private client
Apr  1 01:56:56 precise64 kernel: [ 8365.821130] init: Handling hello event

Su Ubuntu 13.10, i messaggi non compaiono nella directory syslogo in qualsiasi altra parte della /var/logdirectory, anche se comandi come logger hellofunzionano come previsto. Dovrei cercarli da qualche altra parte? C'è un'impostazione di configurazione che devo modificare da qualche parte?

C'è una domanda su Server Fault da qualcuno che sembra avere lo stesso problema su Ubuntu 13.04, e altro qui e qui che potrebbe anche descrivere lo stesso problema. Sfortunatamente, queste domande non offrono alcun vantaggio per il problema.

Risposte:


39

Modifica 02/06/2016

Se stai cercando di trovare "Messaggi di registro di avvio" in generale, seleziona /var/log/upstart/. Ecco dove Upstart salva stdoute stderrdai servizi Upstart. Grazie alla risposta di leopd per averlo sottolineato.

Se stai cercando messaggi di log da Upstart stesso, che sono configurati initctl log-prioritye 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/loganche tu , aggiungi $KLogPermitNonKernelFacility onalla configurazione di rsyslogd. Suggerisco di creare un file personalizzato come /etc/rsyslog.d/60-custom.confper 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-prioritya infocirca.

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: -xmostrerà la funzione (e la priorità), mentre -ue -kdirà 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 kernfunzione, 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 syslogde le sue sostituzioni. rsyslogdlegge /dev/logusando il suo imuxsockmodulo 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/kmsgo può chiamare la chiamata di sistema syslog(), che è descritta in man 2 sysloged è 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, klogdlegge da una di queste interfacce, quindi chiama la funzione glibc syslog()per copiarle nel syslog. rsyslogd legge una di queste interfacce attraverso il suo imklogmodulo di input ma AFAIK non si preoccupa di chiamare glibc syslog(), motivo per cui non è esattamente come klogd; elabora semplicemente l'output imklogesattamente come elabora l'output da qualsiasi altro modulo di input. C'è l'ulteriore avvertimento che tutto l' imklogoutput ha la kernfunzione indipendentemente dal messaggio della struttura nel buffer dell'anello del kernel.

Riferimenti


4
Grazie per la spiegazione approfondita del perché non funzionava e come risolverlo. Una delle risposte alle domande collegate menzionate dmesgma non ha senso senza il contesto qui indicato.
Bradd Szonye,

16

Ho trovato il mio /var/log/upstart/


Ho trovato il mio nel file /var/log/upstart/job.logdove si jobtrova il nome del mio lavoro.
Kenny Evitt,

AFAIK è qui che vanno stdout / stderr dai lavori. Questa domanda riguarda i messaggi di log di Upstart stesso, che non sono associati a un particolare lavoro.
Vanessa Phipps,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.