Sur Ubuntu 12.04, je peux trouver les messages de journal Upstart dans /var/log/syslog
.
Commandes:
# initctl log-priority info
# initctl emit hello
Bûche:
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
Sur Ubuntu 13.10, les messages n'apparaissent pas dans syslog
ni ailleurs dans le répertoire /var/log
, bien que des commandes telles que logger hello
fonctionnent comme prévu. Devrais-je les chercher ailleurs? Y at-il un paramètre de configuration que je dois changer quelque part?
Il y a un question sur Server Fault de quelqu'un qui semble avoir le même problème sur Ubuntu 13.04, et plus ici et ici qui peut aussi être décrivant le même problème. Malheureusement, ces questions n'offrent aucune piste au problème.
Si vous essayez de trouver des "messages de journal Upstart" en général, vérifiez /var/log/upstart/
. C'est là que Upstart enregistre stdout
et stderr
à partir des services Upstart. Merci à la réponse de leopd pour l'avoir signalé.
Si vous recherchez des messages de journal provenant d'Upstart lui-même, qui sont configurés par initctl log-priority
et émis par initctl emit
, poursuivez votre lecture!
Les entrées du journal devraient en fait apparaître dans dmesg. Malgré cela, ils ne s'affichent pas par défaut dans /var/log
.
Si vous les voulez également dans /var/log
, ajoutez $KLogPermitNonKernelFacility on
à la configuration de rsyslogd. Je suggère de créer un fichier personnalisé tel que /etc/rsyslog.d/60-custom.conf
pour éviter de modifier /etc/rsyslog.conf
, car il est géré par dpkg. Les messages Upstart doivent maintenant apparaître dans /var/log/syslog
, une fois que vous avez défini le log-priority
de Upstart sur info
ou plus.
Cela m'a pris des jours pour localiser, mais apparemment Upstart (1.5) ne ne se connecte pas au syslog, c’est-à-dire qu’elle n’appelle pas la fonction glibc syslog()
. Au lieu de cela, Upstart se connecte au tampon circulaire du noyau, qui est lu par dmesg. Maintenant, je ne pensais pas qu'il était possible pour les processus d'espace utilisateur d'écrire dans ce tampon, mais apparemment, ils le peuvent en écrivant dans /dev/kmsg
, et c'est exactement ce que fait Upstart. Voilà donc la première partie du puzzle.
La deuxième partie est qu’il existe une croyance répandue selon laquelle les messages écrits dans la mémoire tampon circulaire du noyau sont automatiquement copiés dans syslog par le noyau (du moins, c’est ce que j’ai toujours pensé). Il s'avère que cela est en fait effectué par un démon de l'espace utilisateur, traditionnellement klogd, qui fonctionne en tandem avec syslogd. Evidemment, rsyslogd remplace syslogd mais apparemment, il remplace également klogd (en quelque sorte: voir les notes à la fin).
La troisième partie est que les messages écrits dans la mémoire tampon du noyau à partir de l'espace utilisateur ont en réalité une apparence différente de ceux qui sont écrits à partir de l'espace noyau: ils ont une installation différente. dmesg a quelques options qui interagissent avec ceci: -x
affichera le service (et la priorité), alors que -u
et -k
diront à dmesg de n’afficher que les messages d’utilisateur et de noyau, respectivement.
Maintenant voici le clincher: par défaut, rsyslogd ignore les messages avec une installation non-noyau lorsqu’il lit les messages à partir de la mémoire tampon circulaire du noyau. L'option de configuration appropriée est $KLogPermitNonKernelFacility
, qui est désactivée par défaut et doit être activée si vous voulez que rsyslogd traite ces messages. Notez que le reste de la configuration de rsyslogd traitera tous les messages du tampon de sonnerie du noyau comme dotés de la fonction kern
, quelle que soit la fonction utilisée dans la mémoire tampon du noyau.
Le code peut écrire dans syslog en appelant la fonction glibc syslog()
, décrite dans man 3 syslog
. Apparemment, ces fonctions écrivent dans /dev/log
. Le code peut être lu à partir de syslog en lisant /dev/log
, et c'est ce que syslogd
et ses remplacements font. rsyslogd
lit /dev/log
en utilisant son module d'entrée imuxsock
.
L'espace du noyau écrit dans ce tampon en appelant la fonction du noyau printk()
; il est donc parfois appelé le tampon printk. L'espace utilisateur peut y écrire en écrivant à /dev/kmsg
. L’espace utilisateur peut lire ce tampon de plusieurs façons: il peut lire /proc/kmsg
(ce que dmesg fait par défaut), il peut lire /dev/kmsg
ou appeler l’appel système syslog()
, décrit dans man 2 syslog
et qui est complètement différent de la fonction glibc syslog()
décrite dans man 3 syslog
. En fait, la glibc fournit un wrapper à l'appel système syslog()
, appelé klogctl()
, pour aider à atténuer cette confusion.
Traditionnellement, klogd
lit l'une de ces interfaces, puis appelle la fonction glibc syslog()
pour les copier dans le syslog. rsyslogd lit l'une de ces interfaces via son module d'entrée imklog
mais AFAIK ne se donne pas la peine d'appeler la glibc syslog()
, ce qui explique pourquoi ce n'est pas exactement comme klogd; il traite simplement la sortie de imklog
, tout comme il traite la sortie de tout autre module d'entrée. Il est à noter que toutes les sorties de imklog
ont la possibilité kern
, quels que soient les messages de cette fonction contenus dans la mémoire tampon du noyau.
J'ai trouvé le mien dans /var/log/upstart/