日志框架浅析
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包。
上一篇: 第24章 退出
下一篇: *霍城以现代化养殖促进产业升级