2011-06-28 11 views
8

¿Cuáles son las mejores prácticas para implementar un grabador/registrador de archivos en Java que sea compatible con logrotate? El objetivo sería permitir que logrotate se use para toda la administración de registros, en lugar de usar la rotación/administración integradas de una API de registro (Log4J, etc.).¿Cómo creo un escritor de archivos amigable con el registro en Java u otra plataforma?

Me gustaría escuchar comentarios/respuestas para otras plataformas de desarrollo, aparte de Java.

Respuesta

8

Simplemente necesita cerrar y volver a abrir periódicamente el archivo de registro dentro de su aplicación. Necesita un controlador que mantenga el último tiempo de cierre. El manejador debe cerrar y volver a abrir el archivo si (por ejemplo) pasaron 20 segundos desde el último cierre y la entrada de registro está a punto de escribirse. Debe hacer dicha comprobación justo antes de escribir la entrada de registro

Si no lo hace, los registros se escribirán en el archivo anterior incluso si se cambia el nombre por logrotate (!) (El descriptor de archivo sigue siendo el mismo) y luego, las entradas del registro desaparecerán cuando el registro se comprima y se elimine (en tal caso, java colocará dichos registros en silencio).

Al cerrar y volver a abrir el registro (utilizando el nombre de archivo) se asegurará de que si se renombra el archivo, se creará uno nuevo. Cerrar y volver a abrir el archivo cada vez que se escribe un registro es una exageración porque abrir un archivo es una operación costosa.

0

Miré algunas otras aplicaciones y aparentemente hay una opción postrotate y una copytruncate option. La opción copiar en cascada es más fácil, pero creo que es menos confiable ya que los almacenamientos intermedios no se pueden eliminar (es decir, sigue la respuesta de @Jarek Potuik) e incluso si lo son, puedes obtener entradas duplicadas o eliminadas.

Así supongamos que desea la opción postrotate:

La opción postrotate le permite ejecutar un comando para decirle a su aplicación a abrir el archivo (cerrar y volver a abrir). Al abrir y cerrar el archivo en Java, haría esto con un bloque sincronizado o algún tipo de bloqueo y, por supuesto, eliminar cualquier búfer.

supongamos que su aplicación se llama myapp:

usted tendría un archivo en /etc/logrotate.d/myapp con algo como:

/var/log/myapp/*.log { 
     weekly 
     missingok 
     rotate 20 
     compress 
     delaycompress 
     notifempty 
     sharedscripts 
     postrotate 
      /etc/init.d/myapp rotate-logs > /dev/null 
     endscript 
} 

El comando /etc/init.d/myapp rotate-logs habría que señalar que la aplicación de cerrar y volver a abrir el registro archivos. La parte de señalización es bastante complicada y depende del tipo de aplicación que tengas porque Java es decir, el comando HTTP REST en el caso de un contenedor de servlets) para indicar a su aplicación que cierre y vuelva a abrir los archivos de registro.

Cuestiones relacionadas