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,但是在
log4j
和slf4j
之间有一个绑定框架,叫做slf4j-log4j
,它还定义了一个名为 org.slf4j.impl.StaticLoggerBinder
的 class,但它重定向到 log4j 的实现。
所以如果你想让slf4j使用特定的框架,只要把准确的jar放在class路径下,这样就可以找到org.slf4j.impl.StaticLoggerBinder
对应的实现了。
这是大图(来源:http://www.slf4j.org/manual.html):
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,但是在
log4j
和slf4j
之间有一个绑定框架,叫做slf4j-log4j
,它还定义了一个名为org.slf4j.impl.StaticLoggerBinder
的 class,但它重定向到 log4j 的实现。
所以如果你想让slf4j使用特定的框架,只要把准确的jar放在class路径下,这样就可以找到org.slf4j.impl.StaticLoggerBinder
对应的实现了。
这是大图(来源:http://www.slf4j.org/manual.html):