Java日志(四):JCL(Jakarta Commons Logging)--与slf4j都是日志框架
一、commons-logging的使用
在项目中引入commons-logging-1.2.jar
,然后直接调用commons-logging提供的接口打印日志:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class JclTest {
private static Log log = LogFactory.getLog(JclTest.class);
public static void main(String[] args) {
if (log.isInfoEnabled()) {
log.info("this is a debug msg!");
}
}
}
//执行结果如下:
三月 29, 2019 11:51:55 下午 org.apache.commons.logging.JclTest main
信息: this is a debug msg!
说明:
(1)commons-logging会自动匹配具体的日志实现,按以下顺序查找:
Ⅰ第一,找classpath路径下是否有commons-logging.properties配置文件,找到则按配置文件里面指定的日志实现来具体地打印日志,比如配置文件指定log4j:org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4J-Logger
Ⅱ第二,查找系统属性(system property)中是否存在属性org.apache.commons.logging.Log
的值,如果有则配置。
Ⅲ第三,查看项目是否引入了log4j,如果有则自动使用其作为日志实现。
Ⅳ第四,如果使用JDK4以上,则自动使用自带的Jdk14Logger。
V第五,略。
(2)上面只是引入commons-logging-1.2.jar
,所以最终使用的是上面顺序中的第三个,使用Jdk14Logger来进行日志输出。
(3)其提供的打印日志的方法也比较简单,如下:
log.fatal(Object message);
log.fatal(Object message, Throwable t);
log.error(Object message);
log.error(Object message, Throwable t);
log.warn(Object message);
log.warn(Object message, Throwable t);
log.info(Object message);
log.info(Object message, Throwable t);
log.debug(Object message);
log.debug(Object message, Throwable t);
log.trace(Object message);
log.trace(Object message, Throwable t);
(4)JCL的commons-logging-1.2.jar
自己为不同日志实现提供了对接方法,这些类依赖对应的日志实现类:
二、对比JCL和slf4j两种日志框架(它们都不是日志打印的最终实现,只是一套规范)
为了方便日志打印可以在jul、log4j、logback等等之间切换,所以门面类日志框架体系(如JCL和slf4j)应运而生,为的就是让系统代码使用一种打印日志的API就能对接多种日志打印具体实现。但是日志框架体系如JCL和slf4j又多起来之后,问题又回到了出发点,假如选用了commons-loggin的日志体系,那么想要切换slf4j是不是还是要重新修改代码中的方法?反之也是如此。
所以,在日志框架选型的时候,还是有必要对比两者的优缺点、差异、共同点。
好像是spring使用commons-logging,hibernate使用slf4j,spring-boot使用logback,真的是萝卜青菜各有所爱。
个人认为slf4j更加强大一点,它使用了占位符{},对各个日志实现支持,规范也不错。
继续深入了解各个日志之后,再结合系统要求来做选择吧,这里不再深入。