Onde estão as mensagens de log do Upstart no Ubuntu 13.X?

28

No Ubuntu 12.04, posso encontrar as mensagens de log do Upstart em /var/log/syslog .

Comandos:

# 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

No Ubuntu 13.10, as mensagens não aparecem em syslog ou em qualquer outro lugar no diretório /var/log , embora comandos como logger hello funcionem conforme o esperado. Eu deveria estar procurando por eles em outro lugar? Existe uma configuração que eu preciso mudar em algum lugar?

Há um question on Server Fault de alguém que parece estar tendo o mesmo problema no Ubuntu 13.04, e mais aqui e aqui que também podem ser descrevendo o mesmo problema. Infelizmente, essas perguntas não oferecem pistas para o problema.

    
por Bradd Szonye 01.04.2014 / 04:03

2 respostas

37

Editar 2016-06-02

Se você estiver tentando encontrar "Mensagens de log do Upstart" em geral, verifique /var/log/upstart/ . É aí que o Upstart salva stdout e stderr dos serviços do Upstart. Graças a resposta de leopd para apontar isso.

Se você está procurando por mensagens de log do próprio Upstart, que são configuradas por initctl log-priority e emitidas por initctl emit , continue lendo!

Versão curta

As entradas de log devem realmente aparecer no dmesg. Apesar disso, eles não aparecem por padrão em /var/log .

Se você quiser também /var/log , adicione $KLogPermitNonKernelFacility on à configuração do rsyslogd. Eu sugiro criar um arquivo personalizado como /etc/rsyslog.d/60-custom.conf para evitar a edição /etc/rsyslog.conf , já que é gerenciado pelo dpkg. Agora, as mensagens do Upstart devem aparecer em /var/log/syslog , assim que você definir o log-priority para info do Upstart ou mais.

Versão longa

Isso me levou dias para rastrear, mas aparentemente o Upstart (1.5) não registra no syslog, ou seja, ele não chama a função glibc syslog() . Em vez disso, o Upstart registra no buffer de anel do kernel, que é o que o dmesg lê. Agora, eu não achei que fosse possível para que os processos de espaço do usuário gravassem naquele buffer, mas aparentemente eles podem gravar em /dev/kmsg , e é exatamente isso que o Upstart faz. Então essa é a primeira parte do quebra-cabeça.

A segunda parte é que existe uma crença generalizada de que as mensagens escritas no buffer de anel do kernel são automaticamente copiadas para o syslog pelo kernel (pelo menos é o que eu sempre achei). Acontece que isso é realmente feito por um daemon de espaço do usuário, tradicionalmente klogd, que opera em conjunto com o syslogd. Obviamente, o rsyslogd substitui o syslogd mas, aparentemente, ele também substitui o klogd (mais ou menos: veja as notas no final).

A terceira parte é que as mensagens gravadas no buffer de anel do kernel a partir do espaço do usuário realmente parecem diferentes das mensagens escritas do espaço do kernel: elas possuem um recurso diferente. O dmesg tem algumas opções que interagem com isto: -x mostrará o recurso (e a prioridade), enquanto -u e -k dizem ao dmesg para mostrar apenas mensagens de facilidade do usuário e mensagens do recurso do kernel, respectivamente.

Agora aqui está o argumento: por padrão, o rsyslogd ignora mensagens com um recurso não-kernel quando está lendo mensagens do buffer de anel do kernel. A opção de configuração relevante é $KLogPermitNonKernelFacility , que está desativada por padrão e precisa ser ativada se você desejar que o rsyslogd processe essas mensagens. Note que o resto da configuração do rsyslogd tratará todas as mensagens do buffer de anel do kernel como tendo o recurso kern , independente do recurso que elas tivessem no buffer de anel do kernel.

Mais informações

syslog

O código pode gravar no syslog chamando a função glibc syslog() , descrita em man 3 syslog . Aparentemente, essas funções gravam em /dev/log . O código pode ler do syslog lendo /dev/log , e é isso que o syslogd e suas substituições fazem. rsyslogd/dev/log usando seu módulo de entrada imuxsock .

Buffer de anel do kernel

O espaço do kernel grava neste buffer chamando a função do kernel printk() , então às vezes é chamado de buffer do printk. O espaço do usuário pode gravar escrevendo para /dev/kmsg . O espaço do usuário pode ler esse buffer por vários métodos: ele pode ler /proc/kmsg (o que o dmesg faz por padrão) ou ler /dev/kmsg ou chamar o sistema syslog() , que é descrito em man 2 syslog e é completamente diferente da função glibc syslog() descrita em man 3 syslog . A glibc na verdade fornece um wrapper para a chamada do sistema syslog() , chamada klogctl() , para ajudar a aliviar essa confusão.

Tradicionalmente, klogd lê uma dessas interfaces e, em seguida, chama a função glibc syslog() para copiá-las para o syslog. O rsyslogd lê uma dessas interfaces através de seu módulo de entrada imklog , mas o AFAIK não se incomoda em chamar o glibc syslog() , e é por isso que ele não é exatamente como o klogd; ele apenas processa a saída de imklog da mesma forma que processa a saída de qualquer outro módulo de entrada. Há a ressalva adicional de que todo imklog output possui o recurso kern , independentemente das mensagens do recurso no buffer de anel do kernel.

Referências

  • link (Afirma incorretamente que Upstart logs para syslog)
  • link
  • link
  • link (Note que isto é para v5, usado no Ubuntu 12.04. Estas opções são considerados legados em versões recentes do rsyslog)
por Matthew Phipps 02.07.2014 / 19:13
16

Eu encontrei o meu em /var/log/upstart/

    
por Leopd 26.05.2015 / 02:14