Como evitar o recarregamento do apache ao girar logs?

25

Eu uso o logrotate para girar os logs de acesso, erro e reescrita do Apache. Meu arquivo de configuração fica 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 que o Apache seja recarregado toda vez que o logrotate faz uma rotação?

harpa
fonte

Respostas:

42

O motivo pelo qual o apache precisa de uma atualização é que, uma vez aberto um arquivo, ele recebe um identificador de arquivo e continuará gravando no identificador de arquivo. Quando você move o arquivo, ele não vê isso, mas continua gravando no mesmo identificador. Quando você recarrega, ele abre o arquivo novamente e ganha um novo identificador.

Para evitar a recarga, em vez de mover o arquivo, você pode copiá-lo e esvaziar o arquivo antigo. Dessa forma, o apache pode continuar escrevendo no mesmo arquivo. 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
}
Jenny D
fonte
Obrigado pela sua resposta. Então eu acho que quando eu adiciono lastaction echo "" | /apache/*log endscripto filehandle não está "perdido"?
harp
3
Desculpe, eu deveria ter dito "copytruncate" em vez de "copy". Então você não precisa da última ação. Eu culpo ter muito sangue em meu córrego da cafeína :-)
Jenny D
Funciona como um encanto :)
harp
4
@harp tenha cuidado, o logrotatedocumento diz: "Observe que há uma fatia de tempo muito pequena entre copiar o arquivo e truncá-lo, para que alguns dados de registro possam ser perdidos".
Totor
Além da possibilidade de perda de alguns dados, existem outras desvantagens conhecidas no uso copytruncate?
Leo Galleguillos
5

Eu recomendo que você use http://cronolog.org/

É 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
Boris Ivanov
fonte
1
A canalização para qualquer programa externo pode ser um problema se houver muito tráfego para o servidor da web. Mas evita claramente o problema de manipulação de arquivos.
Jenny D
Parece uma boa alternativa. O cronolog é compactado on-the-fly?
harp
Há aplicativos similares "rotatelogs" no pacote apache2-utils. Apenas tome cuidado para não "canalizar" no mesmo arquivo de log de diferentes servidores virtuais apache - eles irão pisotear uns aos outros.
Arie Skliarouk