O Apache se recusa a gravar em um arquivo de log após eu excluir manualmente todo o seu conteúdo

9

Por que o Apache se recusa a gravar nos arquivos de log (os ErrorLog/ CustomLogones) depois que eu apaguei manualmente o conteúdo deles?

Ele não será gravado nesses arquivos de log novamente até que eu reinicie o Apache.

Por que esse é o caso? Como posso limpar com segurança um arquivo de log sem precisar reiniciar o Apache?

Eu tenho o Apache 2.2.14 no Ubuntu 10.04.

AtomicFault
fonte
Como você exclui o conteúdo?
Dom
@ Dom Acabei de abri-lo com o vim, faça "dG" (que apaga todo o conteúdo) e salve com "! Wq". A propriedade / grupo / permissões não são alteradas.
AtomicFault
3
@AtomicFault Provavelmente, porque não é assim que você deve girar os logs do Apache . Você deve usar algo como o logrotateque envia um sinal de recarregar / reiniciar apropriado para o Apache (veja a resposta de Pedro abaixo). Nickgrim coberto o "porquê" por trás de seus logs de parar - Apache ainda está escrevendo para o velho inode (que já não está ligado ao sistema de arquivos em qualquer lugar você pode obter para ele)
voretaq7

Respostas:

14

Acabei de fazer um breve teste:

$ echo vim test > vimtest
$ ls -i vimtest
35149 vimtest
$ vim vimtest
<dG, :wq>
$ ls -i vimtest
35148 vimtest

Observe que vimtestpossui um número de inode diferente após editá-lo e, portanto, é realmente um arquivo diferente (embora com o mesmo nome do arquivo antigo).

Portanto, quando você edita o arquivo com o vim, ele exclui o arquivo antigo e cria um novo com o mesmo nome. O problema que você está vendo é causado pelo Apache ainda gravando no arquivo antigo (excluído) (você pode verificar isso com lsof).

Se você realmente deseja truncar um arquivo de log, considere truncate -s 0 /path/to/file.log(o que parece truncar no local)

nickgrim
fonte
2
echo> /path/to/file.log também funciona
8

Eu recomendaria forçar a rotação dos arquivos de log do Apache2 com:

$ sudo logrotate -f /etc/logrotate.d/apache2

Se você examinar /etc/logrotate.d/apache2, verá que a Apache2configuração precisa ser recarregada depois de excluir seu arquivo de log com:

$ sudo /etc/init.d/apache2 reload

No Ubuntu, você pode, alternativamente, fazer:

$ sudo service apache2 reload
Pedro Romano
fonte