暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

技术笔记-日志框架对比及使用

弥之猫 2021-04-01
726

存在多种日志框架,目前常用的日志框架包括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是有冲突的。


文章转载自弥之猫,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论