Erlo

日志框架浅析

2019-03-15 22:01:50 发布   87 浏览  
页面报错/反馈
收藏 点赞

                             

 

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包。

 

 

登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认