Quando usar a opção delaycompress no logrotate?

33

A página do manual logrotatediz que:

It can be used when some program cannot be told to close its logfile
and  thus  might  continue writing to the previous log file for some
time.

Estou confuso com isso. Se um programa não puder ser solicitado a fechar seu arquivo de log, ele continuará gravando para sempre , não por um tempo . Se a compactação for adiada para o próximo ciclo de rotação, o programa continuará gravando nesse arquivo mesmo após o próximo ciclo de rotação. Como o adiamento está resolvendo o problema?

Meu entendimento é que isso copytruncatedeve ser usado quando um programa não puder ser solicitado para fechar o arquivo de log. Estou ciente de que alguns dados gravados no arquivo de log são perdidos quando a cópia está em andamento.

Eu estava olhando para o arquivo logrotate para couchdb, e tinha tanto copytruncatee delaycompressopções.

/usr/local/couchdb-1.0.1/var/log/couchdb/*.log {
   weekly
   rotate 10
   copytruncate
   delaycompress
   compress
   notifempty
   missingok
}

Parece que não faz sentido usar delaycompressquando copytruncatejá está lá. o que estou perdendo?

Anand Chitipothu
fonte

Respostas:

27

Sua compreensão de copytruncateestá correta, mas o texto da página de manual delaycompressé um pouco enganador. Mais adequadamente, ele deveria dizer "quando um programa não puder ser fechado para fechar imediatamente seu arquivo de log" - por exemplo, se você estiver usando sharedscripts e o script enviar um sinal ao processo usando o log quando todos os arquivos de log tiverem sido rotacionados .

mulher
fonte
1
Quando estou usando copytruncate, não há necessidade de dizer ao programa para fechar seu arquivo de log. Então, não faz sentido especificar delaycompressjunto copytruncate?
Anand Chitipothu
6
Nunca use, a copytruncatemenos que seja absolutamente necessário, pois perde as entradas do log. Você pode usar as duas opções se desejar o outro recurso que delaycompressfornece - a capacidade de ler o arquivo de log anterior sem precisar descompactá-lo primeiro.
womble
Existe outra opção senão copytruncatese eu não puder pedir ao meu programa para recarregar?
Anand Chitipothu
5
Não. É por isso que você deve usar um software que não é ruim e que aceita um sinal para dizer "recarregar seus logs".
womble
3

Não tenho certeza se entendi completamente sua pergunta, mas se você está perguntando o que eu acho ... eu uso isso:

postrotate
          killall -HUP syslog-ng
  endscript

Essa é uma boa (ou pelo menos a) maneira de matar o log e passar para a próxima. Para "programas" ruins, como a plataforma ASA da Cisco, que registra toneladas de dados por segundo, funciona.

Warren
fonte
3

Nós usamos:

  • diariamente
  • delaycompress
  • nodateext

Isso cria uma cópia fixa do apache, access_log access_log.1para que possamos executar nosso pacote Stats como um script no final do dia.

No dia seguinte, logrotate compacta o arquivo, criando access_log.2.zip

Edwardg
fonte