Cronolog vs logrotate

11

Qual ferramenta de rotação de logs você prefere?

Desconhecido
fonte

Respostas:

14

Na minha experiência, o logrotate é ótimo. É muito flexível e funciona bem com a maioria dos softwares.

No entanto, existem alguns problemas e, como o cronolog é principalmente um recurso de rotação de logs da web, anotarei minha experiência com o logrotate + apache, o que foi problemático:

Ao rotacionar logs, devemos notificar o apache que um log está sendo rotacionado, pois, mesmo que a rotação do log renomeie access.log para access.log.1, o apache continuará gravando em access.log.1, como está gravando no inode, e renomear o arquivo não afeta o número do inode.

No debian etch (e provavelmente em muitas outras distribuições), o logrotate está sendo usado para girar os logs do apache. Agora, o apache tem uma reinicialização simples que aconselha os processos filhos do apache a sair assim que terminarem de servir as conexões existentes, o apache relê sua configuração, gera novos processos filhos, que começam a gravar em um novo arquivo de log (caso o anterior fosse rodado).

Isso soa como uma ótima solução, no entanto, o reinício normal nem sempre funciona em determinadas condições (como carga pesada), então os desenvolvedores debian decidiram usar um reinício do apache em vez de um reinício normal, na configuração do apache logrotate. Infelizmente, isso faz com que todas as conexões sejam descartadas de uma só vez, o que é muito ruim para sites muito carregados. Além disso, a reinicialização do apache também pode causar problemas como o apache parar e não iniciar (também em determinadas situações de carregamento), consulte os links de bug abaixo para obter detalhes.

A linha inferior é, logrotate é ótimo, mas pode levar a certos problemas para certos programas. Eu não tenho muita experiência com o cronolog, mas como ele grava logs através de um pipe, não requer recarregamentos do apache quando está girando arquivos de log, o que basicamente resolve tudo o que é descrito acima.

Bugs relacionados ao logrotate / apache debian:

  1. Bug no Debian # 301702
  2. Bug do Debian # 400455
Tom Feiner
fonte
1
a solução para o acima é usar truncar! o que ele faz é copiar o conteúdo de access.log para access.log.1 e depois esvaziar o access.log (como você vê os restos de inode de access_log permanecem os mesmos). Normalmente, você não possui logs maiores que alguns GB (na pior das hipóteses), para que todo o processo não demore muito!
Nikolaidis Fotis
3

Eu prefiro o cronolog, mas não é uma preferência muito forte.

logrotate onde é iniciado pelo cron e se um sistema estiver inoperante por algum motivo quando a rotação deveria ter acontecido, seus arquivos de log não serão girados.

Também gosto que os arquivos de log tenham a data (% Y% m.combined.access.log) no nome, porque mantenho esses logs por um longo tempo. Na maioria dos sistemas, por padrão, o apache logrotate nomeará os arquivos access.log, access.log.1, etc. Pode ser possível usar uma data nos arquivos de log com logrotate, mas não consegui descobrir como fazer a última vez que procurei.

Zoredache
fonte
2
O problema em que o logrotate não funciona se tiver passado o tempo do cron pode ser corrigido instalando o pacote "anacron".
58630
ou melhor ainda, você pode salvar seus logs no formato desejado - isso pode ser feito com modelos no rsyslog - (% ano% -% mês% -% dia% _lala.log). neste caso, você nem precisa girar os logs, porque todos os dias o nome é alterado!
Nikolaidis Fotis
2

Sempre usado logrotate. É o que o Debian usa por padrão e eu nunca tive nenhuma reclamação com ele.

David Pashley
fonte
2

Eu quase usar exclusivamente cronologsobre logrotate. logrotatevem com o Debian, e eu permito que continue trabalhando para os serviços do sistema, como os logs do servidor de correio. Mas para Apache e lighttpdarquivos de log, é tudo cronolog.

Uma das razões pelas quais eu uso cronologé que toda a configuração acontece na linha do arquivo de log da configuração do servidor web

por exemplo, em um lighttpdarquivo de configuração, você pode colocar:

accesslog.filename = "|/usr/bin/cronolog --symlink=/var/log/webs/access.log /var/log/webs/%Y/%W-access.log"

E todos recebem um novo arquivo de log toda semana sem nenhuma outra configuração. Ou você pode ser criativo e fazer algo como:

accesslog.filename = "|/usr/bin/cronolog --symlink=/var/log/webs/access.log /var/log/webs/%Y/%m/%a-access.log"

E obtenha um arquivo de log que mostre tráfego por dia da semana. por exemplo, todos os domingos, todas as terças-feiras.

O melhor é que, mesmo se o servidor estiver inativo por um período de tempo, o arquivo de log correto será usado na reinicialização.

Marc DM
fonte
1
Isso se parece muito com svlogd (da linhagem runit e daemontools).
Tobu