
Usamos o upstart para gerenciar nossos serviços em nossos servidores Ubuntu. Eles produzem logs que são desconectados em /var/log/upstart/SERVICE_NAME.log
Então, diariamente, os arquivos de log são rotacionados usando o script logrotation que vem com o 12.04 LTS:
/var/log/upstart/*.log {
daily
missingok
rotate 7
compress
notifempty
nocreate
}
O problema é que, embora o logrotate mova os arquivos, ele não parece sinalizar para o iniciante fechar e reabrir os arquivos, deixando o processo inicial gravando em um PID de exclusão.
init 1 root 8w REG 202,1 64 2431 /var/log/upstart/dbus.log.1 (deleted)
init 1 root 13w REG 202,1 95 2507 /var/log/upstart/acpid.log.1 (deleted)
init 1 root 14w REG 202,1 127 17377 /var/log/upstart/whoopsie.log.1 (deleted)
init 1 root 36w REG 202,1 122 6747 /var/log/upstart/SERVICE_NAME.log.1 (deleted)
init 1 root 37w REG 202,1 30 6762
Obviamente eu poderia redirecionar a saída dos meus próprios serviços para outros arquivos de log, mas o problema ainda estaria presente nos processos do sistema. Além disso, preferiria não ter que construir mais infraestrutura do que preciso.
Responder1
Acredito que você tenha 3 opções.
Você modifica a configuração existente adicionando "copytruncate"
/var/log/upstart/*.log { copytruncate daily missingok rotate 7 compress notifempty nocreate }
Se você não pode ou (não tem permissão) para alterar a configuração de logrotate existente por causa de outros arquivos de log que não sofrem e a configuração existente funciona para eles, mova seus arquivos "SERVICE_NAME.log" para uma nova pasta em / var/log se desejar, crie uma nova configuração com o "copytruncate" e adicione-a ao cron.daily.
a) Se você não tiver permissão para alterar a configuração do host os logrotate ou adicionar ao cron.daily do sistema operacional host, sua terceira opção é alterar os scripts ou programas para verificar se o arquivo existe antes de gravá-lo no arquivo. b) Outra maneira é um pouco do ponto 2 acima, que é mover seus arquivos de log para outro lugar e dentro do seu script ou programa, executar o comando logrotate específico para o arquivo de log desse programa.
O ponto 3b acima é mais complicado, mas mais elegante, e é o que eu uso na maioria das vezes, pois significa que o programa é autossuficiente e autogerenciado e não precisa dos trabalhos do sistema operacional para cuidar dele.
Para descobrir como executar manualmente o logrotate e adicioná-lo ao seu programa ou script, basta digitar:
man logrotate
ou
logrotate --help
Se você estiver usando Python para seus programas, poderá verificar como este programa o utiliza para autogerenciar seus arquivos de log. http://bazaar.launchpad.net/~ferncasado/keep.awake/trunk/files/head:/v4/
Responder2
Acontece que este é um problema conhecido e obilhetepermanece aberto enquanto digito isso.
A coisa certa a fazer é, provavelmente, apenas remover /etc/logrotate.d/upstart
tudo e girar os arquivos dos serviços individuais individualmente. Como o diretório ( /var/log/upstart/
) contém apenas o stdout/stderr dos vários serviços - e nenhum serviço destinado a ser executado como umdaemondeveria estar enviando para esses dois canais. Exceto, talvez, logo no início.
Nos sistemas que estou gerenciando, três serviços são executados pelo iniciante: php5.6-fpm
, php7.1-fpm
e acpid
. Nenhum dos três logs está ativo, mas às vezes o fpm é reiniciado devido ao seu arquivo de log principal ( /var/log/php5.6-fpm.log
) ser girado - e isso causa esse ruído, porque gera alguma inanidade na inicialização.
Se você insistir em girar esses arquivos de qualquer maneira, poderá confiar no fato de que seus nomes correspondem aos nomes dos serviços e usar o seguinte postrotate
script:
postrotate
service=${1##*/}
service=${service%.log*}
service $service restart > /dev/null
endscript
Para que o procedimento acima funcione, certifique-se denãouse o verbo ali - meu scriptlet depende do fato de que o caminho real para o arquivo será passado para ele como o primeiro argumento ( sharedscripts
$1
).
(O redirecionamento para /dev/null
é útil, porque service
-command é barulhento - e você não quer que esse ruído seja enviado a você por e-mail pelo cron. Observe que não estou redirecionando stderr
para lá, apenas stdout
- se houver um problema, você ainda receberei seu e-mail sobre isso.)