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包即可。

其他整合方式见图片即可。

图片参考官网:https://www.slf4j.org/legacy.html