2010-04-27 16 views
10

Tenemos una aplicación modular donde los módulos tienen sus propios registros log4j (es decir, registro de comunicación y registro de errores). Los appenders y las categorías para estos están configurados en el núcleo log4j XML, pero no todos los módulos están siempre instalados. El DailyRollingFileAppender crea su archivo independientemente del uso y expone el conjunto completo de módulos, aunque no está presente, y como algunos de ellos son específicos del cliente, nos gustaría ocultar los registros que no están en uso. ¿Hay alguna manera de hacer que DailyRollingFileAppender cree su archivo el primer uso en lugar de hacerlo automáticamente al inicio?¿Cómo hago que log4j cree archivos de registro bajo demanda solamente?

+0

¿Por qué no excluye bloques para componentes deshabilitados en el núcleo XML? – newtover

+0

Estamos implementando la configuración de log4j oonce y luego los módulos se pueden agregar más adelante. A medida que dejamos abiertos los detalles de log4j para cambios locales, tenemos dificultades para modificar el archivo en instalaciones posteriores. Y sí, tenemos un requisito de alto nivel de automatización de instalación. – Mirvnillith

Respuesta

4

Los appenders archivo tienen ninguna opción de crear perezosamente los archivos de registro - el método setFile crea automáticamente el archivo si no existe ya: ostream = new FileOutputStream(fileName, append);

Vas a tener que ampliar el appender y sobreescribir el archivo de inicialización codifíquese para obtener el comportamiento que busca.

+0

Agradezco que esta respuesta sea un poco tarde, pero he estado luchando contra Log4j demasiado recientemente como para dejar las preguntas pendientes :-) – Andy

+0

Voy a tener que morder esa bala, entonces ... – Mirvnillith

6

Tuve el mismo problema, así que extendí la clase FileAppender estándar y creé un nuevo LazyFileAppender que es un FileAppender que inicializa el archivo de registro (lo crea solo cuando ocurre la primera operación de escritura).

El LazyFileAppender y algunas otras adiciones a la biblioteca log4j estándar se pueden encontrar en una biblioteca simple que he creado: log4j-additions.

Usted puede mirar en el origen para desarrollar su propia extensión o se puede usar como está ...

0

extender la clase FileAppender norma no tuvo éxito para mí. Así que he encontrado otra solución que usa appenders programáticamente para crear archivos de registro bajo demanda solamente (y con marca de tiempo en el archivo de nombre). He escrito estos dos métodos:

public void startLog() { 
    SimpleDateFormat sdf_long = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); 
    FileAppender fa = new FileAppender(); 
    fa.setName("foo"); 
    fa.setFile(sdf_long.format(new Date()) + ".log"); 
    fa.setLayout(new PatternLayout("%d{HH:mm:ss.SSS} %m%n")); 
    fa.setThreshold(Level.DEBUG); 
    fa.setAppend(true); 
    fa.activateOptions(); 
    Logger.getRootLogger().addAppender(fa); 
} 

public void stopLog() { 
    Logger.getRootLogger().getAppender("foo").close(); 
    Logger.getRootLogger().removeAppender("foo"); 
} 

presentar mi log4j.properties sólo configura el appender consola. Cuando quiero comenzar a registrar llamo al método startLog(). Cuando quiero iniciar sesión en otro archivo, llamo primero a stopLog() y luego al método startLog().

Cuestiones relacionadas