¿Cómo evitar la recarga de Apache al rotar registros?

25

Utilizo logrotate para rotar los registros de acceso, error y reescritura de Apache. Mi archivo de configuración se ve así:

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

Mi problema es que cada vez que ocurre una rotación, Apache tiene que volver a cargarse porque Apache ya no escribe en el archivo de registro recién girado. ¿Hay alguna manera de evitar la recarga de Apache cada vez que logrotate hace una rotación?

arpa
fuente

Respuestas:

42

La razón por la que Apache necesita una recarga es que una vez que abre un archivo, obtiene un identificador de archivo y seguirá escribiendo en ese identificador de archivo. Cuando mueve el archivo, no ve eso, simplemente sigue escribiendo en el mismo controlador. Cuando realice una recarga, abrirá el archivo nuevamente y obtendrá un nuevo identificador.

Para evitar la recarga, en lugar de mover el archivo, puede copiarlo y vaciar el archivo anterior. De esa forma, apache puede seguir escribiendo en el mismo identificador de archivo. Para ello, agregue la opción "copytruncate" al archivo de configuración logrotate, de esta manera:

/apache/*log {
    copytruncate
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/apache
    notifempty
    missingok
}
Jenny D
fuente
Gracias por tu respuesta. Entonces, ¿supongo que cuando agrego lastaction echo "" | /apache/*log endscriptel identificador de archivo no está "perdido"?
arpa
3
Lo siento, debería haber dicho "copytruncate" en lugar de "copy". Entonces no necesitas nada de la última acción. Culpo tener demasiada sangre en mi flujo de cafeína :-)
Jenny D
Funciona como un encanto :)
arpa
44
@harp tenga cuidado, el logrotatedocumento dice: "Tenga en cuenta que hay un intervalo de tiempo muy pequeño entre copiar el archivo y truncarlo, por lo que podrían perderse algunos datos de registro".
Totor
Además de la posibilidad de que se pierdan algunos datos, ¿hay alguna otra desventaja conocida para usar copytruncate?
Leo Galleguillos
5

Te recomiendo que uses http://cronolog.org/

Así es como lo 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
fuente
1
La conexión a cualquier programa externo puede ser un problema si hay mucho tráfico al servidor web. Pero evita claramente el problema del manejo de archivos.
Jenny D
Parece una buena alternativa. ¿El cronólogo se comprime sobre la marcha?
arpa
Hay aplicaciones similares "rotatelogs" en el paquete apache2-utils. Solo tenga cuidado de no "canalizar" en el mismo archivo de registro desde diferentes servidores virtuales apache: se pisotearán entre sí.
Arie Skliarouk