2010-08-16 32 views
6

Quiero actualizar slf4j con Logback en una aplicación heredada. Lo bueno es que la aplicación heredada tiene su propio marco de registro. Entonces, todo lo que tuve que hacer fue alterar el marco de registro para iniciar sesión en slf4j en lugar de log4j.Cómo envolver la API slf4j

Funcionó como un sueño. Estaba contento, hasta que noté la ubicación Logback registrado para cada evento de registro:

Logger.java:... 

¡Yikes! Eso no iba a ayudar mucho a mis compañeros desarrolladores cuando intentaba averiguar de dónde venía un evento de registro.

¿Cómo puedo decirle a Logback que busque algunos niveles en la pila para que la ubicación real se registre?

La clase Logger es una clase de servicio con métodos como éste:

public static void debug(String clazz, String message) { 
    org.slf4j.Logger logger = LoggerFactory.getLogger(clazz); 
    logger.debug(message); 
} 
+1

pregunta similar: http: // stackoverflow.com/questions/1486233/java-logging-show-the-source-line-number-of-the- calller-not-the-logging-helper-m – Thilo

+0

hizo esto cuando estaba usando log4j? Creo que desde que actualizó una clase de registro existente, no agregó un marco adicional a la pila de llamadas, por lo que la versión log4j debería haber exhibido el mismo problema. – Thilo

+1

log4j expone un método de registro en su API pública que parece un marco adicional en la pila, mientras que slf4j no lo hace. Entonces sí, funcionó con log4j. –

Respuesta

10

Encontré la solución mirando la fuente de jcl-over-slf4j. La mayoría de las implementaciones de slf4j (incluyendo logback) utilizan los madereros que implementan LocationAwareLogger, que tiene un método de registro que espera el nombre de clase completo de la clase envoltura registrador como uno de sus argumentos:

private static final String FQCN = Logger.class.getName(); 


public static void debug(String clazz, String message) { 
    org.slf4j.Logger logger = LoggerFactory.getLogger(clazz); 
    if (logger instanceof LocationAwareLogger) { 
     ((LocationAwareLogger) logger).log(null, FQCN, LocationAwareLogger.DEBUG_INT, message, null, null); 
    } else { 
     logger.debug(message); 
    } 
} 
5

Véanse los distintos implementaciones XXX-sobre-SLF4J de cómo hacerlo.

Básicamente, usted quiere reemplazar su marco de registro actual por completo. No envolver slf4j.

Editar:

Otro enfoque podría estar escribiendo su propio diseño de la subclasificación de la que utiliza ahora, que tiene un significado revisada del l%, campos, etc% m, que se salta el marco de pila adicional.

+2

Consideré esa solución, pero actualmente no hay un presupuesto para reemplazar más de 10000 declaraciones de registro dispersas en más de 50 proyectos. –

+0

No es necesario cambiar las instrucciones de registro, sino el código al que llama (que afortunadamente se encuentra en una biblioteca) –

+1

El marco de registro tiene más de 10000 llamadas a métodos de todos los proyectos. Entonces, si reemplacé el marco logger, ¿no tendría que reemplazar todas las llamadas a métodos también? –

Cuestiones relacionadas