2011-02-27 19 views
5

Tengo una aplicación con varios "controladores" y me gustaría tener cada registro en su propio archivo. Esto es bastante fácil para su propio código, pero también estoy usando un código de biblioteca que usa el registro de commons. ¿Podría de alguna manera obtener ese código para iniciar sesión en el archivo específico del controlador también?Inicie sesión en un archivo diferente según el subproceso

Estaba pensando que de alguna manera podría hacerlo por Tema:

class Controller { 

public void action() { 
    setCurrentThreadLogFile(myLogFile); 
    try { 
    Library.stuff(); 
    } finally { 
    restoreCurrentThreadLogFile(); 
    } 
} 

} 

Actualmente estoy usando commons-logging para mi propio registro, así, con log4j como backend. Pero podría cambiar eso, si es necesario, o usar una mezcla (es posible dentro del marco de registro de recursos comunes).

Una forma en que podría hacer esto sería escribir mi propia implementación de registro de commons (posiblemente una envoltura alrededor de log4j), pero ¿hay una solución existente?

+0

¿La programación orientada a Aspect sería una opción para usted? Creo que esto podría resolver su problema elegantemente. –

Respuesta

2

Es probable que desee ver contextos de diagnóstico mapeados (MDC). El registro de Commons no los admite, pero lo hace Log4J, por lo que tendrías que ir directamente a Log4J para configurarlo. Probablemente tendrá que hacer rodar su propio filtro para filtrar utilizando el MDC y aplicarlo a los appenders.

Si desea cambiar las implementaciones de registro, puede usar SL4J como la fachada de registro y Logback como la implementación de registro. Haga que el controlador o algún tipo de filtro/interceptor agregue un valor discriminador para una clave que va a usar para discriminar los controladores con el MDC. Use un SiftingAppender para separar el evento de registro en archivos separados.

+0

Posiblemente podría cambiar mi propio código de tipo de biblioteca para usar SLF4J, pero ¿qué pasa con el código que no está bajo mi control que usa el registro de commons? –

+0

SLF4J tiene soporte para API heredadas. Proporciona una implementación del registro de commons implementado utilizando su API. Solo necesita reemplazar el archivo de registro de commons con jcl-over-slf4j.jar. Ver [enlace] (http://www.slf4j.org/legacy.html#jcl-over-slf4j). – Will

+0

No estaba claro. Sé que SLF4J tiene un adaptador de registro común, pero ¿eso funciona con MDCs? Con eso quiero decir que si utilizo el código de la biblioteca dentro de un contexto, ¿la salida del registro terminará en el archivo correcto? (No es necesario que pueda editar el MDC desde el código de la biblioteca). –

1

¿Un registrador por hilo? Coloque el registrador en ThreadLocal. Si está usando java.util.logging, un Handler podría hacer esto transparente para la persona que llama.

+0

Un ThreadLocal es de hecho una herramienta que usaría si tuviera que escribir mi propia implementación. No uso java.util.logging, sin embargo, no logré configurarlo correctamente en Tomcat. –

Cuestiones relacionadas