是否有强制slf4j使用特定的日志记录提供程序(在我的情况下是logback)?正如他们的文档:
在类路径上找到了多个绑定
SLF4J API被设计为一次只与一个底层日志框架绑定。如果类路径上存在多个绑定,SLF4J将发出警告,列出这些绑定的位置。 如果类路径上有多个绑定,请选择一个且只能使用一个绑定,并删除其他绑定。例如,如果类路径上同时包含slf4j-> simple-1.6.6.jar和slf4j-nop-1.6.6.jar,并且您希望使用nop(> no-operation)绑定,则删除来自类路径的slf4j-simple-1.6.6.jar。如果无法删除超级绑定,SLF4J仍将与一个日志框架/实现绑定。从版本1.6.6开始,SLF4J将命名它实际绑定的框架/实现类。
注意SLF4J发出的警告就是警告。
在我的情况下,我有log4j.jar
,slf4j-log4j12.jar
,log4j-over-slf4j.jar
以及classpath中的所有logback jar。我知道将slf4j-log4j12.jar
和log4j-over-slf4j.jar
放在一起是错误的,但我的项目非常大,找到并排除maven依赖并不总是很简单。在这种情况下,slf4j甚至没有打印任何警告,因为我们只使用logback配置。我花了一天时间来理解这个罐头。
我想要的是强制slf4j通过JVM参数使用logback,例如,它可以打印警告,我可以在将来排除jar。
答案 0 :(得分:22)
通常,您自己的代码位于类路径的开头。因此,一种方法是创建自己的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";
}
}
答案 1 :(得分:16)
除了清理类路径外,没有办法强制SLF4J与给定的实现绑定。