存在多种日志框架,目前常用的日志框架包括Log4j1,Log4j2,Commons Logging,Slf4j,Logback,这么多日志框架总是傻傻分不清楚,不知道哪些时候引入哪些包,也不知道日志转接的时候应该引入哪些包,经过初步的学习,发表下个人的见解。
1.日志框架的分类
日志框架可以分为三类,一类是实现框架;一类是接口框架;一类是桥接框架。
第一类:Log4j和Logback是具体的日志实现方案,它会加载配置文件,进行日志输出;
第二类:Commons Logging、Slf4j,它们是日志门面。这个得聊一下门面模式,是软件工程中常用的一种软件设计模式,也被称为正面模式、外观模式。它为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用。换句话来说,就是它类似做了一层service封装,我们使用时可以直接调用这层service,service里面又可以有不同的日志实现;
第三类:桥接框架,它是实现不同日志框架转换的利器。
这样的一个分类逻辑,可以简单的理解为接口与接口的实现,调用者只需要关注接口而无需关注具体的实现,做到解耦。
目前,我们比较常用的组合使用方式是Slf4j与Logback组合、Sfl4j与log4j2、Commons Logging与Log4j组合使用。得注意Logback必须配合Slf4j使用,由于Logback和Slf4j是同一个作者,其兼容性不言而喻。
2.日志框架的核心包
(版本号只做参考,可使用其他版本)
1.如果在我们系统中单独使用log4j的话,我们只需要引入log4j的核心包就可以了
log4j-1.2.17.jar代码如下:
private static final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(Log4jTest.class);2.如果在我们系统中单独使用log4j2的话,我们只需要引入log4j2的核心包就可以了
log4j-api-2.7.jar
log4j-core-2.7.jar
代码如下:
private static org.apache.logging.log4j.Logger logger = org.apache.logging.log4j.LogManager.getLogger(Log4jTest.class);3.如果我们在系统中单独使用logback的话,我们只需要引入logback的核心包就可以了
logback-access-1.1.2.jar
logback-classic-1.1.2.jar
logback-core-1.1.2.jar
一般与slf4j一起配合使用,代码如下:
private final static Logger logger = LoggerFactory.getLogger(App.class);4.commons-logging的核心包
commons-logging-1.0.4.jar代码如下:
private final static Log logger = LogFactory.getLog(CommonsTest.class);5.slf4j的核心包
slf4j-api-1.6.4.jar代码如下:
private static final Logger logger = LoggerFactory.getLogger(Slf4jTest2.class);日志门面一般不单独使用,如果要单独使用还需要引入下面的jar
slf4j-simple.jar(未验证)3.日志框架的组合
上面说过了日志框架的分类,也简单说了几个组合,接下说一下我们如何去进行组合使用。
1.slf4j+log4j:
如果我们在系统中需要使用slf4j和log4j来进行日志输出的话,我们需要引入下面的jar包:
log4j核心jar包:log4j-1.2.17.jar
slf4j核心jar包:slf4j-api-1.6.4.jar
slf4j与log4j的桥接包:slf4j-log4j12-1.6.1.jar
slf4j-log4j12-1.6.1.jar,这个包的作用就是使用slf4j的api,但是底层实现是基于log4j;
2.slf4j+log4j2:
如果我们在系统中需要使用slf4j和log4j2来进行日志输出的话,我们需要引入下面的jar包:
log4j2核心jar包:log4j-api-2.7.jar和log4j-core-2.7.jar
slf4j核心jar包:slf4j-api-1.6.4.jar
slf4j与log4j2的桥接包:log4j-slf4j-impl-2.7.jar
log4j-slf4j-impl-2.7.jar,这个包的作用就是使用slf4j的api,但是底层实现是基于log4j2
3.slf4j+logback:
如果我们在系统中需要使用slf4j和logback来进行日志输出的话,我们需要引入下面的jar包:
logback核心jar包:logback-access-1.1.2.jar、logback-classic-1.1.2.jar、logback-core-1.1.2.jar
slf4j核心jar包:slf4j-api-1.7.25.jar
可以看到slf4j与logback之间是无缝链接,不需要桥接包。
4.commons-logging(jcl)+log4j2
如果我们在系统中需要使用commons-logging和log4j2来进行日志输出的话,我们需要引入下面的jar包:
commons-logging核心jar包:commons-logging-1.0.4.jar
log4j2核心jar包:log4j-api-2.7.jar和log4j-core-2.7.jar
commos-logging与log4j2核心jar包:log4j-jcl-xx.jar
4.日志框架的桥接
上面讲的更多是正常使用的场景,还有一些我们遇到存量问题该怎么处理。比如以前用的日志实现框架是log4j,现在为了提升性能,需要改为使用log4j2进行实现。下面讲讲这种类型的桥接:
1.log4j -> log4j2 桥接
需要去掉 log4j-1.2.17.jar,添加log4j-1.2-api.jar,配合 log4j-api-2.7.jar 和log4j-core-2.7.jar 即可,依赖如下
log4j-1.2-api.jar
log4j-api-2.7.jar
log4j-core-2.7.jar
2.log4j2 -> log4j 桥接
不建议这么做。本来log4j在2015年停止更新后,就建议转向log4j2,并提供了到log4j2的桥接接口。所以反过来log4j2到log4j是不建议这么做的,log4j2也没有提供直接支持。
3.log4j -> slf4j桥接
将代码中的log4j日志桥接到 slf4j,需要如下jar包
log4j-over-slf4j.jar
log4j-api-2.7.jar
4.log4j2 -> slf4j桥接
将代码中的log4j2日志桥接到 slf4j,需要如下jar包
log4j-api-2.7.jar
log4j-to-slf4j-2.7.jar
slf4j-api-1.6.4.jar
注意,上面的桥接单独使用,都没有问题,但是组合使用可能会出现一些jar包冲突的问题,比如:log4j-over-slf4j.jar和log4j-to-slf4j-2.7.jar是有冲突的。




