spring (boot)使用log4j2实现slf4j日志门面

jcl-over-slf4j + slf4j-api + log4j-slf4j-impl + log4j-core

解决启动时报错:

No SLF4J providers were found

Failed to load class "org.slf4j.impl.StaticLoggerBinder

只想看解决报错的点击>>这里<<



一、Java日志框架

详情参考1 详情参考2

当系统逐渐复杂,System.out.println() 满足不了我们的时候,就需要写日志了

Java日志时间轴:

log4j(1999-2015)--> JUL(2000-)--> JCL --> slf4j --> logback(2006-) --> log4j2(2012-)

  1. log4j(作者Ceki Gülcü)出来时就等到了广泛的应用(注意这里是直接使用),是Java日志事实上的标准,并成为了Apache的项目

  2. Apache要求把log4j并入到JDK,SUN拒绝,并在jdk1.4版本后增加了JUL(java.util.logging)

  3. 毕竟是JDK自带的,JUL也有很多人用。同时还有其他日志组件,如SimpleLog等。这时如果有人想换成其他日志组件,如log4j换成JUL,因为api完全不同,就需要改动代码。

  4. Apache见此,开发了JCL(Jakarta Commons Logging),即commons-logging-xx.jar。它只提供一套通用的日志接口api,并不提供日志的实现。很好的设计原则嘛,依赖抽象而非实现。这样应用程序可以在运行时选择自己想要的日志实现组件。

  5. 这样看上去也挺美好的,但是log4j的作者觉得JCL不好用,自己开发出slf4j,它跟JCL类似,本身不提供日志具体实现,只对外提供接口或门面。目的就是为了替代JCL。同时,还开发出logback,一个比log4j拥有更高性能的组件,目的是为了替代log4j。

  6. Apache参考了logback,并做了一系列优化,推出了log4j2

总结,目前我们使用JCL或slf4j门面,使用logback或log4j2实现



二、日志桥接

首先看slf4j官方说日志应该如何桥接

官方文档1
spring (boot)使用log4j2实现slf4j日志门面

官方文档2
spring (boot)使用log4j2实现slf4j日志门面

Spring 框架选择使用了 JCL 作为默认日志输出。而 Spring Boot 默认选择了 SLF4J 结合 LogBack

所以在Spring中我们应当使用jcl-over-slf4j + slf4j-api + log4j-slf4j-impl + log4j-core

在Spring Boot中我们应当去除LogBack依赖后使用jul-to-slf4j + slf4j-api + log4j-slf4j-impl + log4j-core

但是Spring Boot提供了更好的选择spring-boot-starter-log4j2

从maven官网中我们可以看到它集成了log4j-slf4j-impl + log4j-core + log4j-jul + jul-to-slf4j



三、解决报错

本文编辑于2021-12-11

第一个报错No SLF4J providers were found

原因是slf4j-api、jcl-over-slf4j版本不对,用了2.0.0-alpha5,应该用1.7.32

第二个报错Failed to load class "org.slf4j.impl.StaticLoggerBinder

原因是从maven官网复制的配置含有<scope>test</scope>,应该改为<scope>compile</scope>

这些报错如果按报错提示的链接去官网查看的话,都是要求引入一堆依赖进项目,但其实并不是解决根本问题,反而会以为引入混乱的依赖导致最后写日志的不是log4j2了



四、log4j2配置文件

配置文件名为log4j2.xml,放在resources文件夹下



上一篇:处理Hbuilder H5页面打包APP 返回直接退出的问题


下一篇:Apache Log4j爆“核弹级“漏洞,对众多java应用平台造成影响,已发现近万次攻击