欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

日志框架浅析

程序员文章站 2022-06-28 20:58:17
1. 日志简介 在Java项目中,日志是必不可少的功能,日志对于快速定位问题,检查日常项目运行状态等有非常重要的作用,但是目前Java日志存在多种框架,如:Log4j、Log4j2、Commons Logging、Slf4j、Logback、Jul等。 2. 常用日志框架 Log4j,Apache基 ......

                             

 

1. 日志简介

 

  在java项目中,日志是必不可少的功能,日志对于快速定位问题,检查日常项目运行状态等有非常重要的作用,但是目前java日志存在多种框架,如:log4j、log4j2、commons logging、slf4j、logback、jul等。

 

2. 常用日志框架

 

  log4j,apache基金会项目,日志实现框架。

  log4j 2,是log4j的升级产品,但是与log4j不兼容。

  commons logging,简称jcl,apache基金会项目,日志门面组件。

  slf4j,日志门面组件。

  logback,日志实现框架。 

  jul, java官方的日志实现框架。

  介绍到这里大家可能比较疑惑,记录日志到底该用哪个组件,其实实现日志记录可以直接使用日志实现框架,比如logback、log4j、log4j2或者jul,但是一旦这么做如果碰到日志组件更换或者升级,将会很麻烦,比如你需要去每一个使用日志记录的类中去修改,

 日志框架浅析

  所以我们在项目中一般不直接使用日志实现框架,而是使用外观模式:日志门面组件+桥接器+日志实现框架,这样即使项目更换日志种类,只需更换桥接器和日志实现框架,也就是只更换jar包就可以了,代码无需做任何改动。

  下图表示了日志门面组件、桥接器、日志时间框架之间的关系:

日志框架浅析

 

 

3. 日志选用

 

  建议选择slf4j+logback,相比其他组合相比有以下优势:

    1) 限制较少,使用范围更广。

    2) 更好的性能,更低的开销。

    3) 文档免费

    4) slf4j和logback是同一个人开发,衔接好。

如果你不想使用该组合,也可以选用其他组合,很多人也使用slf4j+log4j,这里把slf4j和其他日志实现框架组合和所需要的桥接器列出,可自行选用:

日志框架浅析

更详细的slf4j官网(https://www.slf4j.org/manual.html#swapping)示意图如下:

日志框架浅析

 

 

 4. 问题处理

 

  实际上不单单存在日志门面组件到日志实现框架的桥接器,还存在另外一种桥接器,就是可以把日志实现框架重定向到日志门面组件,我们暂时就叫它“重定向桥接器”吧,例如:log4j-over-slf4j-version.jar、jcl-over-slfj-version.jar(jcl虽然也是日志门面组件,但是也可以实现重新定向),jul-over-slf4j-version.jar等。这些“重定向桥接器”的存在,不谨慎处理会造成一些异常,首先要知道,为什么会存在这类桥接器?不要不行吗?因为项目中你自己主动打印的日志,可能是想用slf4j+logback,但是项目中使用了许多其他依赖,这些依赖用的日志实现不尽相同,这时候就需要统一项目日志记录系统,所以就有了这些“重定向桥接器”。

  常见异常为:

 1)日志框架浅析

  这种异常是因为slf4j作为日志门面接口,结果依赖中出现了多个不同日志实现框架的桥接器,所以出现多重绑定的异常,如果你想使用logback作为日志实现,那就保留logback-classic桥接器,屏蔽其他桥接器,想使用其他日志实现框架的话同理。

2)日志框架浅析

这种异常是因为slf4j使用桥接器到某个日志实现框架,然后该框架又使用“重定向桥接器”调用slf4j,即“slf4j -> 桥接器 -> 日志实现框架 -> ‘重定向桥接器’-> slf4j”,形成闭环,循环调用,从而堆栈溢出。解决办法就是,屏蔽“重定向桥接器”,打破闭环。

举例:

(1) slf4j-log4j12.jar和log4j-over-slf4j.jar共存,会形成slf4j -> slf4j-log4j12 -> log4j -> log4j-over-slf4j -> slf4j 的闭环,这个时候根据你实际项目使用日志情况,打破闭环,比如你本身并不使用log4j作为日志实现框架而用的是logback,那就可以屏蔽slf4j-log4j12.jar。

(2) jul-to-slf4j.jar和slfj-jdk14.jar共存,方法同上。

 

 

5.查看冲突

 

  如果使用idea作为开发工具,可以很方便的看到依赖冲突的情况。

  (1) 打开项目的pom.xml文件,然后右击->maven->show dependencies,如果没有此项功能,请看一下file- > plugins -> umlsupport插件下了没。

日志框架浅析

  (2) 然后出现如下,按住ctrl,使用鼠标滚轮可调整大小,ctrl+f 可以搜索jar。

 日志框架浅析

  (3) 连接带红线的就是有冲突的jar包,点击该jar包会显示版本信息,顺着红色虚线就可以找到冲突的jar包 , 然后对着冲突的jar包点击右键,选择exclude就可以屏蔽冲突的jar包。

 日志框架浅析