Rotar un archivo que está abierto y escrito en todo momento

10

Tengo una aplicación de Linux que escribe continuamente información de registro en un archivo de registro, por ejemplo. /var/log/application.log. Como la aplicación no gira el archivo automáticamente, este archivo de registro puede alcanzar un tamaño de gigabytes en algunas semanas, por lo que quiero poder rotar este archivo correctamente

Mi principal preocupación aquí es que para rotar un archivo abierto por la aplicación en todo momento, probablemente necesite:

  1. Mueva el archivo a su forma girada /var/log/application.log -> /var/log/application.log.2013-01-28

  2. Crea un vacío /var/log/application.log. Obs: en este punto, el proceso de solicitud todavía está escribiendo a/var/log/application.log.2013-01-28

  3. Cambie el descriptor de archivo del proceso de solicitud para volver a apuntar a /var/log/application.log

Entonces, ¿tengo razón? Si es así, ¿cómo puedo hacer esto? (principalmente el cambio de la parte del descriptor de archivo)

Si no lo soy, ¿cuál es la forma correcta y cómo hacerlo?

Bruno Polaco
fuente
¿Necesita borrar el archivo o simplemente rotarlo?
Ewwhite
¿Qué aplicación? La aplicación tiene que proporcionar soporte para hacer esto correctamente. (De lo contrario, puede hacer algo muy feo: adjuntar al proceso, abrir el nuevo archivo, dup2el nuevo descriptor sobre el anterior, luego cerrar el nuevo descriptor.)
David Schwartz
Interesante acercamiento Schwartz. Tengo curiosidad por ver eso en acción y jugaré con él un rato. De todos modos, la aplicación está en casa y estoy buscando una solución más general. Por cierto
Bruno Polaco
@ewwhite Necesito rotarlo, no puedo permitirme perder los datos del registro
Bruno Polaco

Respuestas:

11

Escribe una logrotateconfiguración para usarcopytruncate

copytruncate
    Truncate the original log file in place after creating a copy, instead of moving the 
    old log file and optionally creating a new one. It can be used when some program
    cannot be told to close its logfile and thus might continue writing (appending) to
    the previous log file forever. Note that there is a very small time slice between
    copying the file and truncating it, so some logging data might be lost. When this
    option is used, the create option will have no effect, as the old log file stays
    in place.
RS
fuente
Interesante, truncar el archivo después de copiarlo parece bastante inteligente, incluso con el margen de pérdida de datos. No noté esta opción en logrotate. Gracias por la idea :)
Bruno Polaco
1

La mayoría de estas aplicaciones responden a una señal, como SIGHUP, y cerrarán y volverán a abrir sus archivos de registro al recibir la señal. Consulte la documentación de su aplicación para ver la señal correcta para enviar.

Michael Hampton
fuente
Y si no es así, puede reiniciar la aplicación como alternativa. Eso es lo que suele hacer syslog, y muchos otros programas.
lsd