Spring Boot 2.x 将 logback 1.2.x 升级至 1.3.x

场景

安全部门针对代码进行漏洞扫描时,发现 logback-corelogback-classic 都属于 1.2.x 版本,这个版本存在 CVE 漏洞,并且建议升级到 1.3.x 版本。

问题

将两个包直接升级到 1.3.x 版本时,Spring Boot Web 服务启动直接出现错误

Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinderat org.springframework.boot.logging.logback.LogbackLoggingSystem.getLoggerContext(LogbackLoggingSystem.java:293)at org.springframework.boot.logging.logback.LogbackLoggingSystem.beforeInitialize(LogbackLoggingSystem.java:118)at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationStartingEvent(LoggingApplicationListener.java:238)at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:220)at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)

原因

org.slf4j.impl.StaticLoggerBinder 这个类在 1.2.x 中由 logback 自行实现,在1.3.x 版本中,这个类已经消失,

所以直接升级logback的包看起来并不可行,因为spring boot的代码中对实用到了1.2.x中的类。

在这里插入图片描述

解决

按照上面所说的原因,直接升级spring boot到新版本就可以支持 logback 1.3.x

但是遗憾的是 spring boot 需要版本在 3.x.x 之上才支持 logback 1.3.x ,并且使用 spring boot 3 需要 jdk 17的支持,

这就麻烦了,如此大版本的升级,对于系统的影响,可能无法预知,是否存在不升级版本还能兼容使用 logback 1.3.x 的方法。

最终方案

经过尝试,我使用了下面的步骤,在不升级 spring boot 版本的情况下,成功使用 logback 1.3.x

1. 单独升级logback版本, pom.xml

<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>2.0.4</version>
</dependency>
<dependency><groupId>org.slf4j</groupId><artifactId>log4j-over-slf4j</artifactId><version>2.0.4</version>
</dependency>
<dependency><groupId>org.slf4j</groupId><artifactId>jul-to-slf4j</artifactId><version>2.0.4</version>
</dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>1.3.0</version>
</dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.3.0</version>
</dependency>

2. 禁用spring boot自身对日志的适配

@SpringBootApplication
public class Application {public static void main(String[] args) {System.setProperty("org.springframework.boot.logging.LoggingSystem", "none");SpringApplication.run(Application.class, args);}}

3. 在resources根目录下增加logback.xml文件

这一步根据自己的需求配置饥渴。

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false"><property name="app" value="xxx"/><property name="filename" value="xxx"/><import class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"/><import class="ch.qos.logback.core.rolling.RollingFileAppender"/><import class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"/><import class="ch.qos.logback.core.ConsoleAppender"/><import class="ch.qos.logback.classic.AsyncAppender"/><import class="ch.qos.logback.classic.filter.ThresholdFilter"/><appender name="INFO" class="RollingFileAppender">....</appender><appender name="ERROR" class="RollingFileAppender">.....</appender><appender name="STDOUT" class="ConsoleAppender">...</appender>....<appender name="ASYNC_INFO" class="AsyncAppender">....</appender>....<appender name="ASYNC_ERROR" class="AsyncAppender">....</appender><logger name="sun.rmi" level="error"/><logger name="sun.net" level="error"/><logger name="javax.management" level="error"/><logger name="org.redisson" level="warn"/><logger name="com.zaxxer" level="warn"/><root level="INFO" additivity="false"><appender-ref ref="STDOUT"/><appender-ref ref="ASYNC_INFO"/><appender-ref ref="ASYNC_ERROR"/></root>
</configuration>

4. 完毕

这时候启动项目即可正常运行。

原因说明:

slf4j-api 1.8之后的版本不再使用静态绑定,意味着不再需要StaticLoggerBinder,使用的是ServiceLoader机制,

新版本的 logback 自然为了适配,删除了 StaticLoggerBinder,使用 ServiceLoader 机制,

因此禁用了 spring boot 自身的日志适配,引入高版本logback后,logback自身通过 ServiceLoader 即引入项目中正常使用

PS

本文参考了:

  1. springboot 版本1.5.4 版本低 logback 升级1.3以上项目启动冲突

  2. logback更新到1.3版本tomcat无法启动问题解决

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/623230.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【解决】Spring Boot创建项目常见问题

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;Spring学习之路&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 idea无maven选项 无效发行版17 类⽂件具有错误的版本 61.0, 应为 …

stm32实现hid键盘

前面的cubelmx项目配置参考 stm32实现hid鼠标-CSDN博客https://blog.csdn.net/anlog/article/details/137814494?spm1001.2014.3001.5502两个项目的配置完全相同。 代码 引用 键盘代码&#xff1a; 替换hid设备描述符 先屏蔽鼠标设备描述符 替换为键盘设备描述符 修改宏定…

RocketMQ 01 Linux安装

RocketMQ 01 主要内容&#xff1a; 编译安装HelloWorld官网名词 官方网站 http://rocketmq.apache.org GitHub https://github.com/apache/rocketmq Quick Start Linux下使用Maven编译源码安装 Rocketmq4.6需要jdk1.8环境编译和运行 各版本要求 VersionClientBroke…

RabbitMQ实战教程(2)

十、RabbitMQ实战教程 在掌握了SpringCloudAlibaba的应用后&#xff0c;再来玩&#xff01;&#xff01; 为了更好的理解RabbitMQ在项目中的作用&#xff0c;来一套实战操作。 10.1 RabbitMQ实战场景 首先模拟一个场景&#xff0c;电商中对应的处理方案。 模拟一个用户在电…

武汉好地科技教你如何辨别CMMI认证证书的真假

现在的CMMI V3.0版本是通过集成的产品套件可将业务目标直接与运营和能力相关联&#xff0c;从而推动在时间、质量、预算、客户满意度和其他关键驱动力的改进并取得可量化的卓越表现。 之前我们武汉好地科技咨询老师也公布了取得CMMI3-CMMI5认证证书的企业名单&#xff0c;从名…

如何在Windows使用固定公网地址SSH远程访问本地Archcraft系统

文章目录 1. 本地SSH连接测试2. Archcraft安装Cpolar3. 配置 SSH公网地址4. 公网远程SSH连接小结 5. 固定SSH公网地址6. SSH固定地址连接 Archcraft是一个基于Arch Linux的Linux发行版&#xff0c;它使用最简主义的窗口管理器而不是功能齐全的桌面环境来提供图形化用户界面。 C…

设计模式代码实战-观察者模式

1、问题描述 小明所在的学校有一个时钟&#xff08;主题&#xff09;&#xff0c;每到整点时&#xff0c;它就会通知所有的学生&#xff08;观察者&#xff09;当前的时间&#xff0c;请你使用观察者模式实现这个时钟通知系统。 注意点&#xff1a;时间从 0 开始&#xff0c;并…

【网络编程】UDP实现回显服务器

一.网络编程的基本术语. 客户端 客户端是为用户提供本地服务的程序&#xff0c;通常位于用户设备上。也称为用户端&#xff0c;是相对于服务器而言的。它主要指安装在用户设备上的程序&#xff0c;这些程序能够与服务器进行通信&#xff0c;从而获取服务或者执行特定功能。在…

【设计模式】笔记篇

目录标题 OO设计原则策略模式 - Strategy定义案例分析需求思路分析核心代码展示进一步优化UML 图 观察者模式 - Observe定义案例分析需求UML图内置的Java观察者模式核心代码 总结 装饰者模式 - Decorator定义案例分析需求UML图分析核心代码 总结 工厂模式 - Abstract Method/Fa…

excel 无法正确处理 1900-03-01 前的日期

问题由来&#xff1a;excel 用公式 TEXT(A1,"yyyy-mm-dd") 转日期时&#xff0c;当A1 的值等于59 的时候&#xff0c;返回值是1900-02-28&#xff1b;当A1 的值等于61 的时候&#xff0c;返回值是1900-03-01&#xff1b;那么当 A1的值为 60 的时候&#xff0c;返回值…

nfs服务器详解

nfs&#xff08;网络文件系统&#xff09;---------- 其实就是通过网络将文件共享出去。 通过TCP/IP网络去共享资源的。在NFS的应用中&#xff0c;本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件&#xff0c;就像访问本地文件一样。 客户端和服务端需要去读写共…

QT 串口助手 学习制作记录

QT 串口助手qt 学习制作记录 参考教程&#xff1a;​​​​​​QT初体验&#xff1a;手把手带你写一个自己的串口助手_qt设计串口助手的流程图-CSDN博客 Qt之串口编程&#xff08;添加QSerialPort模块&#xff09;_如何安装 qt串口模块教程-CSDN博客 串口调试助手&#xff1…