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

mxd2 5年前

一、之前进行日志操作一般都是在一个类中加入如下代码:

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

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

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

三、后来想起使用log4j要把mybatis的sql语句输出还需要添加slf4j-api-x.x.x.jar和slf4j-log4j12-x.x.x.jar两个包。看到这么多日志,乱七八糟的,所以就度娘了一下,稍微的了解了下这些日志之间的关系。这里顺便给出个人较为肤浅的总结,看官有更好的理解可以留言,大家一起学习进步。

1)commons-logging和slf4j-api

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

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

如果加入log4j的架包的话(需要配置log4j.properties或者log4j.xml),日志效果如下:

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

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

2、slf4j-api和slf4j-log4j12

slf4j-api和commons-logging的接口肯定存在不一致的地方。有的日志实现可能没有遵照slf4j-api的接口来,所以,中间转换一层。所以slf4j-log4j12就是一个类似于一个转换器的味道。这里转换之后使用的是log4j。当然还有其他的,比如sli4j-slf4j-logback。

四、总结

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

2)有的项目使用的可能是slf4j,比如mybatis,如果还要继续使用log4j就需要在引入slf4j-log4j12;

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

来自:http://my.oschina.net/u/2245029/blog/507761