jcl-over-slf4j + slf4j-api + log4j-slf4j-impl + log4j-core
解决启动时报错:
No SLF4J providers were found
Failed to load class "org.slf4j.impl.StaticLoggerBinder
只想看解决报错的点击>>这里<<
一、Java日志框架
当系统逐渐复杂,System.out.println()
满足不了我们的时候,就需要写日志了
Java日志时间轴:
log4j(1999-2015)--> JUL(2000-)--> JCL --> slf4j --> logback(2006-) --> log4j2(2012-)
-
log4j(作者Ceki Gülcü)出来时就等到了广泛的应用(注意这里是直接使用),是Java日志事实上的标准,并成为了Apache的项目
-
Apache要求把log4j并入到JDK,SUN拒绝,并在jdk1.4版本后增加了JUL(java.util.logging)
-
毕竟是JDK自带的,JUL也有很多人用。同时还有其他日志组件,如SimpleLog等。这时如果有人想换成其他日志组件,如log4j换成JUL,因为api完全不同,就需要改动代码。
-
Apache见此,开发了JCL(Jakarta Commons Logging),即commons-logging-xx.jar。它只提供一套通用的日志接口api,并不提供日志的实现。很好的设计原则嘛,依赖抽象而非实现。这样应用程序可以在运行时选择自己想要的日志实现组件。
-
这样看上去也挺美好的,但是log4j的作者觉得JCL不好用,自己开发出slf4j,它跟JCL类似,本身不提供日志具体实现,只对外提供接口或门面。目的就是为了替代JCL。同时,还开发出logback,一个比log4j拥有更高性能的组件,目的是为了替代log4j。
-
Apache参考了logback,并做了一系列优化,推出了log4j2
总结,目前我们使用JCL或slf4j门面,使用logback或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文件夹下