Spring Boot 2.7.x 默认使用 logback 1.2.x 及以下版本,若升级至 1.3.x 及以上版本启动会报错。主要原因是 Spring Boot 2.7.x 依赖 logback-classic 1.2.x 中的类 org.slf4j.impl.StaticLoggerBinder,而 logback-classic 1.3.x 已删除此类。
报错原因分析
通过源码分析查找报错原因,组件版本如下:
- spring-boot: 2.7.18
- logback-classic: 1.2.11
Spring Boot 启动时会调用方法 LoggingApplicationListener.onApplicationEnvironmentPreparedEvent,其中会获取到 LoggingSystem 的实例:

生成 LoggingSystem 实例的方法是 LoggingSystem.get:

其中 SYSTEM_PROPERTY=org.springframework.boot.logging.LoggingSystem。
若 SYSTEM_PROPERTY 的值是 LoggingSystem 的实现类的类名(如 org.springframework.boot.logging.logback.LogbackLoggingSystem),则会创建这个类的实例;若值为 NONE,则生成 NoOpLoggingSystem;否则,Spring Boot 会在类路径中查找日志组件并实例化。
在 onApplicationEnvironmentPreparedEvent 中获取到 LoggingSystem 实例后,会调用 initialize 方法:

在其中会调用 initializeSystem 方法:

其中 CONFIG_PROPERTY=logging.config,即从环境变量 logging.config 中获取 logback 的配置文件,然后使用 LogbackLoggingSystem.initialize 对 logback 进行初始化:

查看 getLoggerContext() 的源代码:



