2009-05-08 12 views
15

Mi aplicación web basada en servlets a veces no cierra los archivos de registro de Log4j cuando se vuelve a desplegar, filtrando a la fuga del descriptor de archivo y ocasionalmente a la muerte contenida por servlet from ' muchos archivos abiertos '.Cómo puedo Log4j correctamente, cerrando todos los Appenders y, por lo tanto, los archivos

Tengo un ContextListener, ¿qué debo poner en su contexto destruido() para decirle a log4j que cierre y libere todos los recursos?

La rápida desnatada sobre javadocs reveló la clase Hierachery con el método shutdown(). No tengo ni idea de cómo conseguir realmente la corriente Hierachery, y los estados javadoc esta clase no tiene componentes que el usuario en el interior :)

Respuesta

19

Prueba esto:

org.apache.log4j.LogManager.shutdown(); 

Sin embargo, el problema que está experimentando es extraño y no debería estar sucediendo. ¿Qué JVM, contenedor, versión log4j estás usando?

+0

Estoy usando Sun's JVM6, Resin y log4j 1.2.14 Supongo que a veces se filtra los clasificadores y evita que se reciclen (finalizando), aún no lo he descubierto. ¡Gracias por la pista! – alamar

1

tuve el mismo problema pero mi solución requiere dos pasos:

En primer lugar, tuve que llamar LogManager.shutdown() de un método destroy() servlets.

Luego tuve que fijar el método close() de nuestra propia implementación Appender de (que es una subclase de AppenderSkeleton), para que se cierre correctamente los appenders de getAllAppenders().

+4

El método de destilación del servlet se puede llamar en cualquier momento (por especificación). Deberías usar ServletContextListener - hay un método contextDestroyed, que se llama solo una vez. –

Cuestiones relacionadas