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

8

Por que o Apache se recusa a gravar em arquivos de log ( ErrorLog / CustomLog ) depois que eu deletei o conteúdo manualmente?

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

Por que isso acontece? Como posso limpar com segurança um arquivo de log sem ter que reiniciar o Apache?

Eu tenho o Apache 2.2.14 no Ubuntu 10.04.

    
por AtomicFault 22.10.2012 / 15:57

2 respostas

13

Acabei de fazer um breve teste:

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

Note que vimtest tem um inode-number diferente depois de editá-lo, e é, portanto, um arquivo diferente (embora com o mesmo nome do arquivo antigo).

Então, quando você edita o arquivo com o vim, ele apaga o arquivo antigo e cria um novo com o mesmo nome. O problema que você está vendo é causado pelo fato de o Apache ainda estar 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 (que parece truncar no local)

    
por 22.10.2012 / 16:13
7

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

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

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

$ sudo /etc/init.d/apache2 reload

No Ubuntu, você pode fazer alternativamente:

$ sudo service apache2 reload
    
por 22.10.2012 / 16:03