Apache se niega a escribir en un archivo de registro después de eliminar manualmente todo su contenido

9

¿Por qué Apache se niega a escribir en los archivos de registro (los ErrorLog/ CustomLogunos) después de haber eliminado manualmente su contenido?

No volverá a escribir en esos archivos de registro hasta que reinicie Apache.

¿Por qué es este el caso? ¿Cómo puedo purgar de forma segura un archivo de registro sin tener que reiniciar Apache?

Tengo Apache 2.2.14 en Ubuntu 10.04.

Falla atómica
fuente
¿Cómo se eliminan los contenidos?
Dom
@Dom Acabo de abrirlo con vim, hago "dG" (que elimina todo el contenido) y luego lo guardo con "! Wq". La propiedad / grupo / permisos no se modifican.
AtomicFault
3
@AtomicFault Prrrobably porque no es así como se supone que debe rotar los registros de Apache . Debería usar algo como lo logrotateque envía una señal de recarga / reinicio adecuada a Apache (consulte la respuesta de Pedro a continuación). Nickgrim cubrió el "porqué" de los registros de detener - Apache sigue escribiendo a la edad i-nodo (que ya no está conectado al sistema de archivos en cualquier lugar se puede llegar a ella)
voretaq7

Respuestas:

14

Acabo de hacer una breve prueba:

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

Tenga en cuenta que vimtesttiene un número de inodo diferente después de editarlo y, por lo tanto, en realidad es un archivo diferente (aunque con el mismo nombre que el archivo anterior).

Por lo tanto, cuando edita el archivo con vim, elimina el archivo anterior y crea uno nuevo con el mismo nombre. El problema que está viendo es causado por Apache que todavía escribe en el archivo antiguo (eliminado) (puede verificar esto con lsof).

Si realmente quiere truncar un archivo de registro, considere truncate -s 0 /path/to/file.log(que parece truncarse en el lugar)

nickgrim
fuente
2
echo> /path/to/file.log también funciona
8

Recomendaría forzar la rotación de los archivos de registro de Apache2 con:

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

Si observa /etc/logrotate.d/apache2, verá que la Apache2configuración debe volver a cargarse después de eliminar su archivo de registro con:

$ sudo /etc/init.d/apache2 reload

En Ubuntu puedes hacer alternativamente:

$ sudo service apache2 reload
Pedro Romano
fuente