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

j2e*_*nue 1 java logback slf4j

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");
  }
}
Run Code Online (Sandbox Code Playgroud)

我怎么知道它使用哪个日志框架?假设我希望它使用logback进行此调用,我怎么知道它不使用另一个框架?

Arn*_*lle 7

如您所知,SLF4J只是一个接口,需要实现.基本上,SLF4J打电话给:

ClassLoader.getSystemResources("org/slf4j/impl/StaticLoggerBinder.class");
Run Code Online (Sandbox Code Playgroud)

编辑:现在,这个信息有点过时了.现在看来,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):

在此输入图像描述