SpringBoot:SpringBoot2.7.x如何将logback升级到1.3.x以上版本

张开发
2026/4/19 19:14:29 15 分钟阅读

分享文章

SpringBoot:SpringBoot2.7.x如何将logback升级到1.3.x以上版本
SpringBoot2.7.x默认使用的是logback-1.2.x及以下版本而如果使用logback-1.3.x及以上版本启动就会报错。主要原因是SpringBoot2.7.x会依赖logback-classic-1.2.x中的类org.slf4j.impl.StaticLoggerBinder而logback-classic-1.3.x中已经将此类删除了。一、报错原因分析下面通过分析源代码查找报错原因组件版本如下spring-boot-2.7.18logback-classic-1.2.11SpringBoot启动时会调用方法LoggingApplicationListener.onApplicationEnvironmentPreparedEvent其中会获取到LoggingSystem的实例而生成LoggingSystem实例的方法是LoggingSystem.get其中SYSTEM_PROPERTYorg.springframework.boot.logging.LoggingSystem若SYSTEM_PROPERTY的值是LoggingSystem的实现类的类名比如org.springframework.boot.logging.logback.LogbackLoggingSystem则会创建这个类的实例若SYSTEM_PROPERTY的值是NONE则生成NoOpLoggingSystem否则springboot会在类路径中自己去查找有哪些日志组件然后实例化。在onApplicationEnvironmentPreparedEvent中获取到LoggingSystem实例后就会调用initialize方法在其中会调用initializeSystem方法其中CONFIG_PROPERTYlogging.config也就是从环境变量logging.config中获取logback的配置文件然后使用LogbackLoggingSystem.initialize对logback进行初始化查看getLoggerContext()的源代码可以看到StaticLoggerBinder是在这个地方被用到了。二、解决方案通过分析上面的源代码就可以知道如果想让SpringBoot2.7.x使用logback-classic-1.3.x及以上版本则需要先将环境变量org.springframework.boot.logging.LoggingSystem的值设置成none也就是不让SpringBoot帮忙初始化logback改由应用自己初始化logback。另外logback-classic升级到1.3.x以上版本slf4j也要升级到1.8.x及以上版本原因可以参考《Javalogback-classic与slf4j版本对应关系》。最后如果logback配置文件的路径以前是通过环境变量logging.config配置的则需要将logback配置文件的路径通过环境变量logback.configurationFile进行配置其中CONFIG_FILE_PROPERTYlogback.configurationFile上述源代码属于logback-classic组件版本如下logback-classic-1.3.15另外以上给出的解决方案logback的官方网站上也有大家可以参考一下地址https://logback.qos.ch/download.html三、进一步说明如果应用是在servlet3.0以上容器部署时logback会由ch.qos.logback.servlet.LogbackServletContainerInitializer初始化而springboot由org.springframework.web.SpringServletContainerInitializer初始化这2个类都实现了javax.servlet.ServletContainerInitializer接口。一般servlet容器会先执行LogbackServletContainerInitializer这样就会把logback初始化完成所以logback一般不是在执行SpringServletContainerInitializer的过程中初始化的。这就解释了为什么只能通过环境变量logback.configurationFile配置logback.xml的路径因为想通过spring的配置设置logback.xml的路径已经错过机会了。

更多文章