Slf4j vs JCL - Binding method

时间:2016-04-04 18:19:06

标签: logging slf4j apache-commons-logging

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?

1 个答案:

答案 0 :(得分:1)

Commons Logging使用用户指南中记录的步骤查找其实现:

  

默认的LogFactory实现使用以下发现过程来确定它应该使用哪种类型的Log实现(当找到第一个肯定匹配时,该过程终止):

     
      
  1. 查找名为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实现的推荐方法。

  2.   
  3. 查找名为org.apache.commons.logging.Log的系统属性(为了向后兼容此API的1.0之前的版本,还会查询系统属性org.apache.commons.logging.log)

  4.   
  5. 如果Log4J日志记录系统在应用程序类路径中可用,请使用相应的包装类(Log4JLogger)。
  6.   
  7. 如果应用程序在JDK 1.4系统上执行,请使用相应的包装类(Jdk14Logger)。
  8.   
  9. 回退到默认的简单日志包装器(SimpleLog)。
  10.   

SLF4J和Commons Logging之间的主要区别在于Commons Logging API相当原始,而SLF4J API更灵活。