1、日志介绍
日志门面框架
JCL(Jakarta Commons Logging) 最后一次更新2014年
SLF4j(Simple Logging Facede for java)
jboss-logging 特定框架用
日志实现
Log4j
Logback
Log4j2 apache提供,性能最屌
JUL(java.util.logging) Java 提供
Log4j 与 Logback创始人是同一个,但Log4j 性能不如Logback。Logback直接实现了SLF4j的接口,Log4j需要一个转换器slf4j-log412.jar。
2、如何使用SLF4J
图片地址:https://www.slf4j.org/images/concrete-bindings.png
图片文章地址:https://www.slf4j.org/manual.html
从图中可以看出:
Logback原生实现SLF4j。
Log4j需要有个转换器->slf4j-log412.jar。
JUL需要有个转换器->slf4j-jdk14.jar。
Slf4j-Simple原生实现SLF4j。
3、如何在项目中将别的日志框架整合到SJF4j里面
图片地址:https://www.slf4j.org/images/legacy.png
图片文章地址:https://www.slf4j.org/legacy.html
例如第一张图,底层使用Logback作为最终实现时。
使用jcl-over-slf4j替换Commons logging。jcl-over-slf4j使用了Commons logging一样的API,但底层调用的时SLF4j的API。
使用log4j-over-slf4j替换log4j。log4j--over-slf4j使用了log4j一样的API,但底层调用的时SLF4j的API。
使用jul-to-slf4j替换log4j。jul-to-slf4j使用了jul一样的API,但底层调用的时SLF4j的API。
4、日志死循环的问题
假设项目存两个jar包:slf4j-log412.jar,log4j-over-slf4j.jar
结果会怎么样呢?
1、slf4j-log412.jar,对外提供slf4j的接口,内部调用log4j的接口,最终是要调用log4j的实现类的。
2、log4j-over-slf4j.jar,对外提供log4j的接口,内部调用slf4j的接口,最终是要找slf4的实现了。
最终死循环了:sjf4j的API -> log4j的API->sjf4j的API -> log4j的API->sjf4j的API -> log4j的API->sjf4j的API -> log4j的API->sjf4j的API -> log4j的API->sjf4j的API -> log4j的API.......
5、spring-boot 使用Logger的jar包依赖
Logback作为实现类:
log4j-to-slf4j 对外提供log4j-api,对内转换成slf4j的调用
+- org.springframework.boot:spring-boot-starter-logging:jar:2.1.6.RELEASE:compile
| +- ch.qos.logback:logback-classic:jar:1.2.3:compile
| | - ch.qos.logback:logback-core:jar:1.2.3:compile
| +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.11.2:compile
| | - org.apache.logging.log4j:log4j-api:jar:2.11.2:compile
Log4j2作为实现类
+- org.springframework.boot:spring-boot-starter-log4j2:jar:2.1.6.RELEASE:compile
| +- org.apache.logging.log4j:log4j-slf4j-impl:jar:2.11.2:compile
| | +- org.slf4j:slf4j-api:jar:1.7.26:compile
| | - org.apache.logging.log4j:log4j-api:jar:2.11.2:compile
| +- org.apache.logging.log4j:log4j-core:jar:2.11.2:compile
| +- org.apache.logging.log4j:log4j-jul:jar:2.11.2:compile
| - org.slf4j:jul-to-slf4j:jar:1.7.26:compile
小知识点:
maven依赖的命令:mvn dependency:tree。
- 表示同层依赖的最后一个节点,如果你跟我一样困惑为啥有的是“+-” 有的是“-”的话。