Could someone explain to me the difference between the discovery & binding methods followed by the slf4j & jcl.
There are just one or two documents available online & I am unable to exactly understand the difference. Seems like JCL tries to look for implementation during runtime, but so does Slf4j - it tries to look for implementation of StaticLoggerBinder on classpath.
Slf4j Code:
if (loggerFactoryClassLoader == null) {
paths = ClassLoader.getSystemResources(STATIC_LOGGER_BINDER_PATH);
} else {
paths = loggerFactoryClassLoader.getResources(STATIC_LOGGER_BINDER_PATH);
}
What's am I missing here?
答案 0 :(得分:1)
Commons Logging使用用户指南中记录的步骤查找其实现:
默认的LogFactory实现使用以下发现过程来确定它应该使用哪种类型的Log实现(当找到第一个肯定匹配时,该过程终止):
查找名为org.apache.commons.logging.Log的此工厂的配置属性(为了向后兼容此API的1.0之前的版本,属性org.apache.commons.logging.log也是咨询)。 配置属性可以由java代码显式设置,但通常通过在类路径中放置名为commons-logging.properties的文件来设置它们。当存在这样的文件时,属性文件中的每个条目都成为"属性" LogFactory。当类路径中有多个这样的文件时,1.1之前的commons-logging版本只使用找到的第一个。从版本1.1开始,每个文件可以定义优先级密钥,并使用具有最高优先级的文件(没有优先级定义意味着优先级为零)。当多个文件具有相同的优先级时,将使用找到的第一个文件。
在commons-logging.properties文件中定义此属性是显式选择Log实现的推荐方法。
查找名为org.apache.commons.logging.Log的系统属性(为了向后兼容此API的1.0之前的版本,还会查询系统属性org.apache.commons.logging.log)
- 如果Log4J日志记录系统在应用程序类路径中可用,请使用相应的包装类(Log4JLogger)。
- 如果应用程序在JDK 1.4系统上执行,请使用相应的包装类(Jdk14Logger)。
- 回退到默认的简单日志包装器(SimpleLog)。
醇>
SLF4J和Commons Logging之间的主要区别在于Commons Logging API相当原始,而SLF4J API更灵活。