SLF4J 和 LOG4J
折腾背景
在公司开发都是使用内部框架的,使用打印日志没怎么关注过。本周在学习Srping的时候采用SLF4J和LOG4J打印日志。分享一下遇到的小问题以及解决方法。
SLF4J是啥
SLF4J是 Simple Logging Facade for Java简称,是为日志框架(比如,java.util.logging, logback 和 log4j)提供接口服务,具体日志打印是怎么实现有日志框架决定的。
小实验
下载SLF4J相关的JAR,引入到lass path。然后运行下面小程序:
1 | import org.slf4j.Logger; |
会报如下错误:
SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
不要担心,到这里说明你向前走了一步,把 slf4j-simple-1.8.0-beta2.jar,在运行一下就出现,你想要的结果了。
[main] INFO HelloWorld - Hello World
使用LOG4J
后面想打印Debug级别的日志,所以下载log4j的JAR包。下载后把其加入class path , 然后执行下面这个测试程序:
1 | import org.slf4j.Logger; |
输入 temperature 大于50则有日志,否则什么也没有。
Temperature has risen above 50 degrees.
然后把slf4j-log4j加入class path 下运行就报如下错误:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/D:/tools/extraLib/log/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/D:/tools/extraLib/log/slf4j-simple-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
先把slf4j-simple-1.8.0-beta2.jar移除,然后在src目前下新建log4j.properties,并敲入如下内容,用于配置log4j.properties和设置debug级别。
1 | log4j.rootLogger=DEBUG, stdout |
最后运行,运行结果如下:
Wombat - Temperature set to 20. Old temperature was null.
Wombat - Temperature set to 60. Old temperature was 20.
Wombat - Temperature has risen above 50 degrees.
为什么遇到上面两个问题,看到手册后面的文档说明就会明白,也是我们注意的地方。现摘录如下:
To switch logging frameworks, just replace slf4j bindings on your class path. For example, to switch from java.util.logging to log4j, just replace slf4j-jdk14-1.8.0-beta2.jar with slf4j-log4j12-1.8.0-beta2.jar.
SLF4J does not rely on any special class loader machinery. In fact, each SLF4J binding is hardwired at compile time to use one and only one specific logging framework. For example, the slf4j-log4j12-1.8.0-beta2.jar binding is bound at compile time to use log4j. In your code, in addition to slf4j-api-1.8.0-beta2.jar, you simply drop one and only one binding of your choice onto the appropriate class path location. Do not place more than one binding on your class path.
特别是下面张图,就会明了SLF4J的是干嘛的了,解决了啥问题。
小思考
阅读了一下manual,以及捣鼓了一下两个示例,对SLF4J有点小想法如下:
- SLF4J易于维护和升级
SLF4J是一个日志API,具体日志怎么整的是日志框架的事情,将日志与日志框架解耦,也即是后面如果项目需要升级比如将 LOG4J到LogBack。 - 高效且易于阅读
现在组里面都是使用+拼接打印的日志的,而SLF4J中可以使用占位符{},比如第二个例子就是。
Author: cloudfeng
Link: https://cloudfeng.github.io/2018/07/07/arts/tip/T-slf4jandlog4j/
License: 知识共享署名-非商业性使用 4.0 国际许可协议