Estou trabalhando no Ubuntu 14 com o utilitário rsyslog e logrotate padrão.
Na /etc/logrotate.d/rsyslog
configuração padrão do rsyslog logrotate , vejo o seguinte:
/var/log/syslog
{
rotate 7
daily
missingok
notifempty
delaycompress
compress
postrotate
reload rsyslog >/dev/null 2>&1 || true
endscript
}
Pelo que entendi, é recomendável usar copytruncate em todos os cenários de rotação de log, pois não move o log atual, mas trunca o log para que qualquer processo com um manipulador de arquivo aberto possa continuar gravando nele.
Então, como é que a configuração padrão usando o recurso de recarga rsyslog?
Falando como autor do rsyslog, copytruncate é realmente uma escolha muito, muito, muito ruim. É inerentemente atrevido e usá-lo é quase uma garantia de que você perderá dados de log. Quanto mais frequentemente o arquivo for gravado, mais você perderá. E isso não é apenas parte da última linha, mas pode ser várias centenas, dependendo do momento exato e do estado do sistema no momento em que a rotação acontece.
Quando o arquivo é movido e um novo inode (arquivo) é criado, o rsyslog mantém o controle do arquivo anterior e conclui o processamento. Portanto, você não tem nenhuma perda neste caso. Garantido (exceto se você desmontar o sistema de arquivos ...).
Sobre "reopenOnTruncate": Eu pessoalmente vi o reopenOnTruncate sendo atrevido em outros aspectos também, especialmente no NFS e similares. Algum tempo atrás, removi totalmente essa funcionalidade, mas mais tarde fui convencido a incorporar funcionalidades semelhantes. Ele permanecerá "experimental" provavelmente para sempre, pois eu realmente sei que as pessoas enfrentam problemas em sistemas muito carregados. "copytruncate" simplesmente não é um modo decente para trabalhar com arquivos de log.
Atualmente, trabalho na refatoração de imfile (ETA 8.34 ou 8.35). A versão refatorada provavelmente poderá impedir o reenvio acidental devido à corrida da API, mas também não pode se proteger contra a perda de dados - porque isso é conceitualmente impossível.
fonte
Isso depende completamente de como o processo está gravando logs.
copytruncate
só funciona, se as mensagens de log são anexados ao arquivo (por exemplowhatever >> logfile
.E não quando ele está redirecionando a saída (por exemplo
whatever > logfile
).fonte
Desde a versão 8.16, o rsyslog possui a opção imfile
reopenOnTruncate
que lida com problemas de cópia de erro.fonte
Para o rsyslog especificamente, provavelmente faz mais sentido deixar as coisas como estão.
O motivo básico é que o rsyslog tem filas internas que podem ser usadas nos casos em que seu identificador de saída se torna indisponível.
A recarga a) fará com que o rsyslog recrie seu próprio arquivo de log eb) faça com que quaisquer eventos na fila sejam liberados para o arquivo na criação.
Pode ser que o copytruncate não cause danos (embora eu esteja preocupado com truncamento de linhas parcialmente escritas), mas eu tenderia a pensar que copiar / excluir / recarregar é 'mais seguro' do ponto de vista da integridade.
Conforme mencionado por @ faker , como o rsyslog pode lidar com a situação em que seu arquivo se torna indisponível, não há um motivo convincente para usar copytruncate.
E, como mencionado por @ SelivanovPavel , o rsyslog na verdade requer uma configuração específica para lidar com a cópia truncada corretamente.
Portanto, apenas porque o uso da
reload
abordagem exige menos desvio da configuração padrão, eu a manteria.fonte