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

SLF4J - how does it know which log type to use

SLF4J 是一个 wrapper/facade class,因此您可以使用许多不同的日志类型,例如 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");

EDIT :现在,这个信息有点过时了。现在看来,SLF4J 使用 java.util.ServiceLoader 加载一个 org.slf4j.spi.SLF4JServiceProvider 但逻辑保持不变。

这意味着你class路径必须包含这样一个class具有这个完全限定名称。

每个与 slf4j 兼容的日志记录框架都定义了这样一个 class。

  • 如果你深入研究 logback 的代码,你会发现一个名为 org.slf4j.impl.StaticLoggerBinder 的 class 重定向到 logback 的实现
  • 如果你深挖log4j的代码,没有这样的class,但是在log4jslf4j之间有一个绑定框架,叫做slf4j-log4j,它还定义了一个名为 org.slf4j.impl.StaticLoggerBinder 的 class,但它重定向到 log4j 的实现。

所以如果你想让slf4j使用特定的框架,只要把准确的jar放在class路径下,这样就可以找到org.slf4j.impl.StaticLoggerBinder对应的实现了。

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