反正是有强制SLF4J使用特定的日志记录提供者(在的logback我的情况)? 在他们的文档:
多个绑定了的类路径中找到
SLF4J API飞漫与一个和在一个时间只有一个底层日志框架结合。 如果不止一个结合存在的类路径上,SLF4J会发出警告,列出这些绑定的位置。 当多个绑定可在类路径上,选择一个且只有一个绑定你希望使用,并删除其他绑定。 举例来说,如果你有两个slf4j->简单1.6.6.jar和类路径上SLF4J-NOP-1.6.6.jar和你想使用绑定NOP(>无操作),然后取出slf4j-简单1.6.6.jar在类路径。 如果这是不可能去除superflous绑定,SLF4J仍将有一个日志框架/实现绑定。 随着1.6.6版本,SLF4J将它命名实际上是绑定到架构/实现类。
注意到SLF4J发出的警告仅仅是一个警告。
就我而言,我有log4j.jar
, slf4j-log4j12.jar
, log4j-over-slf4j.jar
在classpath中所有的logback罐子。 我知道这是错误有slf4j-log4j12.jar
和log4j-over-slf4j.jar
在一起,但我的项目是非常大的,而且它并不总是简单的查找和排除Maven的依赖。 在这种情况下,即使SLF4J没有任何印刷警告,因为我们只使用的logback CONFIGS。 它花了我一天的时间来了解这个瓶子地狱。
我要的是通过JVM参数来强制使用SLF4J的logback,例如,这样就可以打印警告,我可以在将来排除罐。
除了清理你的类路径,没有办法强迫SLF4J与给定的实现结合。
通常您自己的代码是在类路径的开始。 正因为如此,要做到这一点的方法之一是创建自己的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";
}
}