SLF4J - 它如何知道要使用的日志类型

时间:2016-01-07 14:51:00

标签: java slf4j logback

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进行此调用,我怎么知道它不使用另一个框架?

1 个答案:

答案 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的代码,就没有这样的类,但log4jslf4j之间有一个绑定框架,它被称为slf4j-log4j,它也定义了一个名为{的类。 {1}}但重定向到log4j的实现。

因此,如果您希望slf4j使用特定框架,只需将准确的jar放在类路径中,以便找到org.slf4j.impl.StaticLoggerBinder的相应实现。

这是大局(来源:http://www.slf4j.org/manual.html):

enter image description here