Java日志框架log4j、logback、jul这么多?到底如何选择,他们之间有有什么关联?如何整合使用?
一、日志框架分层(API与实现)
现在JAVA的日志框架分为抽象层和实现层,因为当日志升级时无需改动代码即可。
抽象层
- JCL(Jakarta Commons Logging),,
- SLF4j (Simple Logging Facade for Java)
- jboss-logging
抽象层 | 介绍 |
---|---|
JCL(Jakarta Commons Logging) | 是Spring默认的日志框架,Jakarta是Apache旗下的一个小组,所以在使用Spring时需要引入Apache commons-logging.jar包。2014后不再维护,所以不推荐使用。 |
SLF4j (Simple Logging Facade for Java) | 推荐使用 |
jboss-logging | 特定框架使用,一般使用较少 |
实现层
实现层 | 介绍 |
---|---|
jul(java.util.logging) | JAVA原生的日志框架,不推荐使用。 |
log4j | 常用的日志实现层,但是存在性能问题,现在已较少使用。 |
logback | 与log4j是相同的作者,是log4j的升级,推荐使用。目前spring-boot默认使用slf4j的抽象层结合logback的实现层组合。 |
log4j2 | Apache旗下提供的日志实现层,功能强大,目前与其他框架整理不是太广泛 。 |
总结
我们在使用日志框架时需要采用抽象层和实现层的组合来使用,目前推荐slf4j的抽象层结合logback的实现层来使用。
二、slf4j如何结合其他实现层使用
1.slf4j单独结合一种实现的使用
进入SLF4J的官网https://www.slf4j.org/manual.html,可以查看如下整合图片(翻译版)。
如图可知,slf4j结合logback使用时需要引入的依赖有:
- slf4j-api.jar(抽象层)
- logback-classic(实现层)
- logback-core.jar(实现层)
2.当项目中有第三方依赖,且使用的实现层不同时如何整合?
当一个项目中需要引入其他第三方依赖,且第三方依赖所使用的日志框架与本系统不一致时如何整合呢?如Spring使用的时jcl,SpringBoot使用的slf4j。
根据图中的第一点我们知道,要采用slf4j结合logback的方案,且第三方依赖存在jcl(springboot整合spring),除了本身需要的:
- slf4j-api.jar(抽象层)
- logback-classic(实现层)
- logback-core.jar(实现层)
之外还需要引入
- jcl-over-slf4j.jar:这个jar包是一个jcl转换成slft4的适配器,引入该jar包即可。
其他整合方式见图片即可。