SLF4J是一个包装器/外观类,因此您可以使用许多不同的日志类型,例如logback,log4j等.假设我想使用logback和log4j,甚至第三个类似java.util.logging.当我写这样的日志:
public class HelloWorld { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(HelloWorld.class); logger.info("Hello World"); } }
我怎么知道它使用哪个日志框架?假设我希望它使用logback进行此调用,我怎么知道它不使用另一个框架?
如您所知,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的代码,就没有这样的类,但是在它之间有一个绑定框架log4j
,slf4j
它被调用slf4j-log4j
,它也定义了一个名为org.slf4j.impl.StaticLoggerBinder
但是重定向到log4j实现的类.
因此,如果您希望slf4j使用特定框架,只需将准确的jar放在类路径中,以便org.slf4j.impl.StaticLoggerBinder
找到相应的实现.
这是大局(来源:http://www.slf4j.org/manual.html):