2012-07-11 29 views
21

¿Hay alguna forma de forzar a slf4j a usar un proveedor de registro específico (logback en mi caso)? Al igual que en sus documentos: No se encontraronFuerza slf4j para usar logback

Varios enlaces de la ruta de clase

API SLF4J desinged para enlazar con uno y sólo un marco de registro subyacente a la vez. Si hay más de un enlace presente en la ruta de la clase, SLF4J emitirá una advertencia, enumerando la ubicación de esos enlaces. Cuando hay enlaces múltiples disponibles en la ruta de clase, seleccione uno y solo un enlace que desee usar y quite los otros enlaces. Por ejemplo, si tiene slf4j-> simple-1.6.6.jar y slf4j-nop-1.6.6.jar en la ruta de la clase y desea utilizar el enlace nop (> sin operación), entonces elimine slf4j- simple-1.6.6.jar desde la ruta de clase. Si no es posible eliminar los enlaces superflores, SLF4J aún se enlazará con un marco/implementación de registro. A partir de la versión 1.6.6, SLF4J nombrará la infraestructura/clase de implementación a la que está realmente vinculado.

NOTA La advertencia emitida por SLF4J es solo eso, una advertencia.

En mi caso tengo log4j.jar, slf4j-log4j12.jar, log4j-over-slf4j.jar y todos los frascos logback en la ruta de clase. Sé que es un error tener slf4j-log4j12.jar y log4j-over-slf4j.jar juntos, pero mi proyecto es muy grande, y no siempre es fácil encontrar y excluir la dependencia de maven. En este caso, slf4j incluso no imprimió ninguna advertencia, porque usamos solo las configuraciones de logback. Me llevó un día entender este infierno.

Todo lo que quiero es forzar a slf4j a usar el inicio de sesión a través del argumento JVM, por ejemplo, para que pueda imprimir advertencias y pueda excluir tarros en el futuro.

Respuesta

14

Además de limpiar su ruta de clase, no hay forma de obligar a SLF4J a vincularse con una implementación determinada.

+0

Es una lástima para mí – madhead

17

En general, su propio código está al principio de la ruta de clases. Debido a esto, una forma de hacerlo es crear su propia clase org.slf4j.impl.StaticLoggerBinder:

package org.slf4j.impl; 

import org.slf4j.ILoggerFactory; 
import org.slf4j.spi.LoggerFactoryBinder; 

/** 
* Force tests to use JDK14 for logging. 
*/ 
@SuppressWarnings("UnusedDeclaration") 
public class StaticLoggerBinder implements LoggerFactoryBinder { 
    private static final StaticLoggerBinder SINGLETON = new StaticLoggerBinder(); 

    public static String REQUESTED_API_VERSION = "1.6"; 

    public static final StaticLoggerBinder getSingleton() { 
     return SINGLETON; 
    } 

    private StaticLoggerBinder() { 
    } 

    @Override 
    public ILoggerFactory getLoggerFactory() { 
     return new JDK14LoggerFactory(); 
    } 

    @Override 
    public String getLoggerFactoryClassStr() { 
     return "org.slf4j.impl.JDK14LoggerFactory"; 
    } 
} 
+0

Gracias por la respuesta, pero ya he limpiado mi ruta de clases . – madhead

+2

Aún así, esta es una excelente respuesta – StormeHawke

+0

cómo usar este código para el logback, lo que debería devolver ILoggerFactory getLoggerFactory() en lugar de la nueva JDK14LoggerFactory() – nagSumanth

Cuestiones relacionadas