SLF4J是一个包装器/外观类,因此您可以使用许多不同的日志类型,例如logback,log4j等。假设我想要使用logback和log4j,甚至是第三个类似java.util。日志记录。当我写这样的日志时:
public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}
我如何知道它使用哪个日志框架?让我们说我希望它使用logback进行此调用,我怎么知道它不使用另一个框架?
答案 0 :(得分:6)
如您所知,SLF4J只是一个接口,需要实现。基本上,SLF4J打电话给:
ClassLoader.getSystemResources("org/slf4j/impl/StaticLoggerBinder.class");
编辑:现在,这些信息有点过时了。现在看来,SLF4J使用java.util.ServiceLoader
来加载org.slf4j.spi.SLF4JServiceProvider
,但逻辑保持不变。
这意味着您的classpath必须包含具有此完全限定名称的类。
与slf4j兼容的每个日志框架都定义了这样一个类。
logback
的代码,你会发现一个名为org.slf4j.impl.StaticLoggerBinder
的类,它重定向到logback的实现log4j
和slf4j
之间有一个绑定框架,它被称为slf4j-log4j
,它也定义了一个名为{的类。 {1}}但重定向到log4j的实现。因此,如果您希望slf4j使用特定框架,只需将准确的jar放在类路径中,以便找到org.slf4j.impl.StaticLoggerBinder
的相应实现。
这是大局(来源:http://www.slf4j.org/manual.html):