Java日志commons-logging log4j slf4j之间的关系

1、以前进行日志操做通常都是在一个类中加入以下代码:
java

import org.apache.log4j.Logger;
//引入的是log4j的包
private static final Logger LOG = Logger.getLogger(Test.class);

2、后来看见别人的代码是这样写的:sql

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
//引入的是commons-logging的包
private static Log logger = LogFactory.getLog(AccountAction.class);

3、后来想起使用log4j要把mybatis的sql语句输出还须要添加slf4j-api-x.x.x.jar和slf4j-log4j12-x.x.x.jar两个包。看到这么多日志,乱七八糟的,因此就度娘了一下,稍微的了解了下这些日志之间的关系。这里顺便给出我的较为肤浅的总结,看官有更好的理解能够留言,你们一块儿学习进步。
apache

1)commons-logging和slf4j-apiapi

这两个日志包,都是提供出一个标准接口。相似于JDBC同样,给出一个接口,具体怎么实现大家本身去玩。不一样点在于commons-logging本身有一个简单的实现。因此,在(二)的代码中,若是引入了commons-logging没有引入log4j的架包的话,日志能正常打印,打印效果以下:mybatis

若是加入log4j的架包的话(须要配置log4j.properties或者log4j.xml),日志效果以下:学习

简单而言,commons-logging会先去查找commons-logging.properties配置文件,查找指定的实现日志,若是没有,默认去查找log4j(毕竟都是自家作的东西嘛),若是没有指定,也没有找到log4j的架包实现,那么,commons-logging就本身上,结果就是图片一中的效果。而slf4j就没有默认实现。spa

二、slf4j-api和slf4j-log4j12日志

slf4j-api和commons-logging的接口确定存在不一致的地方。有的日志实现可能没有遵守slf4j-api的接口来,因此,中间转换一层。因此slf4j-log4j12就是一个相似于一个转换器的味道。这里转换以后使用的是log4j。固然还有其余的,好比sli4j-slf4j-logback。code

4、总结xml

1)本身的项目使用建议引入commons-logging和log4j两个架包,而后使用(二)中的代码;

2)有的项目使用的多是slf4j,好比mybatis,若是还要继续使用log4j就须要在引入slf4j-log4j12;

3)即便用log4j两个组合:【commons-logging+log4j】和【slf4j+slf4j-log4j12+log4j】;

本文只针对log4j,其余的开源日志未涉及。菜鸟的看法,大牛勿喷。

相关文章
相关标签/搜索