logging - name - logback pattern
Forzar slf4j para usar logback (2)
¿Hay alguna forma de forzar a slf4j a usar un proveedor de registro específico (logback en mi caso)? Como en sus documentos:
Se encontraron múltiples enlaces en la ruta de clase
La API de SLF4J está diseñada para vincularse con una y solo una infraestructura de registro subyacente a la vez. Si hay más de un enlace presente en la ruta de clase, SLF4J emitirá una advertencia, enumerando la ubicación de esos enlaces. Cuando haya varios enlaces disponibles en la ruta de clase, seleccione uno y solo un enlace que desee utilizar y elimine los otros enlaces. Por ejemplo, si tiene slf4j-> simple-1.6.6.jar y slf4j-nop-1.6.6.jar en la ruta de clase y desea usar el enlace nop (> no-operation), elimine slf4j- simple-1.6.6.jar desde la ruta de clase. Si no es posible eliminar los enlaces superfluos, SLF4J aún se enlazará con un marco / implementación de registro. A partir de la versión 1.6.6, SLF4J nombrará la clase de estructura / 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 archivos jar de backback en classpath. 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 no imprimió ninguna advertencia, ya que solo usamos configuraciones de inicio de sesión. Me tomó un día entender este infierno de tarro.
Todo lo que quiero es forzar a slf4j a usar logback a través del argumento JVM, por ejemplo, para que pueda imprimir advertencias y puedo excluir archivos jar en el futuro.
Aparte de limpiar la ruta de su clase, no hay forma de forzar a SLF4J a enlazar con una implementación dada.
En general, su propio código está al principio de la ruta de clase. 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";
}
}