关于 slf4j 和 log4j 使用上的一些体验

工作中的问题

项目中使用的log4j2, 引入了同事写的依赖包,使用的是slf4j搭配log4j。测试时发现,原本程序中的log正常出现,但依赖包里的log完全没有,于是稍微学习了一下 slf4j 的知识。

关于 slf4j 和 log4j 使用上的一些体验_第1张图片
图片转自 https://unsplash.com

slf4j的绑定

slf4j的好处一搜一大堆。总的来说,它是各种log工具的具体实现上面的一个抽象层。用抽象层的好处就是可以解耦合。

既然slf4j本身只是抽象层,它自己并不对log功能进行实现,这就意味着它必须和一个负责实现的log工具搭配使用。在我们的项目中使用的是log4j

和同组的同事沟通之后发现,原来我们的主程序使用的log工具最近从log4j升级到了log4j2,设置文件也从log4j.properties变成了log4j2.properties

检查程序的启动log,又发现了如下WARNING:

SLF4J: Class path contains multiple SLF4J bindings.

log4j和log4j2同时出现在了程序的依赖中,显然这就是问题所在了。

于是我打开IntelliJ的依赖图生成工具,将原本包含在依赖包中的slf4j-log4j12删除掉。再加上对应版本的slf4jlog4j12之间的binding依赖。问题顺利解决。

在这个例子中我们也可以发现使用slf4j的好处。在主程序已经升级到log4j2的情况下,依赖包的代码完全不需要进行更改,只需要对maven的pom文件进行修改,就可以顺利使用主程序的log工具。如果依赖包中直接使用的是log4j的实现的话,我们恐怕不得不在 同时在主程序中使用两个log工具对依赖包的代码进行修改 之间选择其一了。

你可能感兴趣的:(关于 slf4j 和 log4j 使用上的一些体验)