Como evitar o recarregamento do apache ao girar logs?

23

Eu uso o logrotate para girar os logs de acesso, erro e reescrita do Apache. Meu arquivo de configuração é assim:

/apache/*log {
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/apache
    notifempty
    missingok
    lastaction
     /bin/apache reload
    endscript
}

Meu problema é que sempre que ocorre uma rotação, o Apache precisa ser recarregado porque o Apache não escreve mais no arquivo de log recém-rotacionado. Existe uma maneira de evitar o Apache recarrega toda vez que o logrotate faz uma rotação?

    
por harp 10.09.2012 / 11:24

2 respostas

40

O motivo pelo qual o apache precisa de um recarregamento é que, uma vez aberto um arquivo, ele recebe um filehandle para ele e continuará gravando nesse filehandle. Quando você move o arquivo, ele não vê isso, ele simplesmente continua gravando no mesmo identificador. Quando você fizer um recarregamento, ele abrirá o arquivo novamente e obterá um novo identificador.

Para evitar o recarregamento, em vez de mover o arquivo, você pode copiá-lo e esvaziar o arquivo antigo. Dessa forma, o apache pode continuar gravando no mesmo filehandle. Você faz isso adicionando a opção "copytruncate" ao arquivo de configuração logrotate, assim:

/apache/*log {
    copytruncate
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/apache
    notifempty
    missingok
}
    
por 10.09.2012 / 11:47
5

Eu recomendo que você use o link

É assim que eu uso:

CustomLog     "|/usr/local/sbin/cronolog -S /var/log/httpd/t3.CCC.eu-access_log -P /var/log/httpd/t3.CCC.eu-access_log.prev /var/log/httpd/t3.CCC.eu-%Y.log" combined
    
por 10.09.2012 / 11:42