Estou construindo uma placa Linux embarcada com Buildroot ( manual do usuário aqui ).
Eu tenho syslog-ng
correndo na placa. Seu arquivo de configuração é especificado em buildroot aqui: https://github.com/buildroot/buildroot/blob/master/package/syslog-ng/syslog-ng.conf :
@version: 3.37
source s_sys {
file("/proc/kmsg" program_override("kernel"));
unix-stream ("/dev/log");
internal();
};
destination d_all {
file("/var/log/messages");
};
log {
source(s_sys);
destination(d_all);
};
Observe que ele especifica o destino como "/var/log/messages"
, mas o log ativo no quadro está entrando em um arquivo chamado /var/log/messages.1
, e o /var/log/messages
arquivo nem existe. Por que é que? Existe uma maneira de fazer login no /var/log/messages
arquivo em vez disso?
O Syslog, que costumávamos usar, faz login no /var/log/messages
, e estamos tentando manter esse comportamento para consistência.
Notas Adicionais
ls -1 /var/log
em uma placa em execuçãosyslog
contém estesmessages
arquivos:messages messages.1 messages.2 messages.2.gz messages.3 messages.4 messages.5 messages.6 messages.7
ls -1 /var/log
em uma placa em execuçãosyslog-ng
contém essesmessages
arquivos (messages
falta o aviso):messages.1 messages.2 messages.3 messages.4 messages.5 messages.6 messages.7
- Na
syslog-ng
placa,tail -f /var/log/messages.1
mostra que está continuamente recebendo mensagens registradas, o que é inesperado, pois ao usarsyslog
o arquivo "ativo" é/var/log/messages
em vez disso.
Resolvido! Você deve forçar
syslog-ng
a reabertura de seus arquivos de log de destino após cada rotação de logEntão, eu percebi. Obrigado a @Murray Jensen pela dica aqui .
Sempre que
logrotate
gira meu/var/log/messages
arquivo, ele o renomeia para/var/log/messages.1
. No entanto,syslog-ng
está gravando no arquivo apontado pelo descritor de arquivo original (fd) que ele abriu. Renomear o arquivo de/var/log/messages
para/var/log/messages.1
não altera o descritor de arquivo, portanto, o descritor de arquivo syslog-ng agora está gravando em pontos para o arquivo agora chamado/var/log/messages.1
. A correção é simplesmente forçarsyslog-ng
a reabertura de seus arquivos de log e obter novos descritores de arquivo após cada rotação de log, fazendo com que ele obtenha um novo descritor de arquivo para o arquivo de log de destino recém-criado que agora existe em/var/log/messages
.Existem 3 maneiras de fazer isso, sobre as quais escrevi aqui: https://github.com/syslog-ng/syslog-ng/issues/1774#issuecomment-1270517815
Veja aqui onde aprendi sobre
syslog-ng-ctl reopen
, que é a maneira recomendada: https://github.com/syslog-ng/syslog-ng/issues/1774#issuecomment-346624252As 3 formas são:
Portanto, para forçar
logrotate
a chamada de uma das 3 maneiras acima automaticamente após cada rotação de log, você deve adicionar o comando apropriado como umpostrotate
script dentro do seu arquivo de configuração/etc/logrotate.d/syslog-ng
(ou similar - pode ser nomeado qualquer coisa) .logrotate
Aqui está a aparência de um arquivo de configuração logrotate fixo agora:Das minhas notas aqui:
Exemplo de arquivo de configuração
/etc/logrotate.d/syslog-ng
logrotate :Observação: também abri uma solicitação de alteração de documentação aqui: https://github.com/syslog-ng/syslog-ng/issues/4166 . Agora é recomendado usar
syslog-ng-ctl reopen
após cada rotação de log em vez desyslog-ng-ctl reload
.Tentativa antiga de resposta (o que tentei primeiro)
Na placa em execução
syslog-ng
, reflash a imagem rootfs (root filesystem) inteiramente e reiniciei a placa , e agora vejo o/var/log/messages
arquivo novamente:Parte da saída de
ls -1 /var/log
:Eu não posso explicar isso.
tail -f /var/log/messages
realmente mostra logs ativos entrando nesse arquivo, conforme o esperado, etail -f /var/log/messages.1
mostra que o arquivo é estático, sem novas mensagens chegando, também conforme o esperado.Eu posso provar que esta placa está realmente funcionando
syslog-ng
observando a saída deps aux | grep syslog
:...em oposição à saída desse mesmo comando quando executado na
syslog
placa:Mais uma vez, não tenho certeza do que aconteceu, nem por quê.
Em ambas as placas,
ps aux | grep logrotate
mostra quelogrotate
está em execução. Ex:Ambas as placas possuem o mesmo
/etc/logrotate.conf
arquivo, e somente asyslog-ng
placa possui o/etc/syslog-ng.conf
arquivo, que contém o conteúdo conforme mostrado na pergunta.Se eu descobrir algo novo nos próximos dias, voltarei e atualizarei esta resposta.