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.mzph.cn/diannao/562.shtml

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

相关文章

CNN卷积神经网络之LeNet-5原理与实战

文章目录 CNN卷积神经网络之LeNet-5原理与实战1、LeNet-5网络结构&#xff1a;1.1、LeNet-5由两个部分组成&#xff1a;1.2、模型单元结构&#xff1a;1.3、数据的传输&#xff1a; 2、LeNet-5网络参数详解&#xff1a; CNN卷积神经网络之LeNet-5原理与实战 1、LeNet-5网络结构…

MySql8快速迁移版的制作过程

首先说明&#xff0c;mysql 8的安装不同与mysql5.x。 做程序的朋友都知道&#xff0c;程序好做&#xff0c;客户难伺候&#xff0c;因为限于用户的情况&#xff0c;如何能让用户把程序运行起来很关键&#xff0c;比如日前我在做 山东高中信息技术 学考 考前练习 系统时&#x…

VirtualBox虚拟机使用win11系统,忘记密码如何重置密码

1. 点击重启同时按住Shift&#xff08;按住不放&#xff09; 2. 直到出现下面的界面&#xff0c;释放Shift&#xff0c;并进入疑难解答 3. 进入高级选项 4. 进入命令提示符 5. 发现当前是在X盘&#xff1f; 6. 进入C:\Windows\System32 c: cd Windows\System32 7. 备份osk.exe…

27个必备的Python技巧,你一定要知道!

目 录 01. 为什么使用缩进来分组语句&#xff1f; Guido van Rossum 认为使用缩进进行分组非常优雅&#xff0c;并且大大提高了普通 Python 程序的清晰度。大多数人在一段时间后就学会并喜欢上这个功能。 由于没有开始/结束括号&#xff0c;因此解析器感知的分组与人…

C++能不能调用C语言的动态库?

能。C当然可以调用C语言编写的动态库。 在C和C开发中&#xff0c;有许多知名的C库被广泛使用&#xff0c;比如C标准库、zlib、libcurl、sqlite、cairo等等等等。这些库在C项目中经常会被用到。在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C语言的资…

Rust入门-引用借用

一、引用借用&#xff0c;是什么、为什么、怎么用 所有权上篇我们已经讨论过了&#xff0c;所以这篇我们讨论Rust的引用借用 1、引用借用 是什么&#xff1f; Rust 通过借用(Borrowing) 这个概念来达成上述的目的&#xff0c;获取变量的引用&#xff0c;称之为借用(borrowin…

维护SQLite的私有分支(二十六)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite、MySQL 和 PostgreSQL 数据库速度比较&#xff08;本文阐述时间很早比较&#xff0c;不具有最新参考性&#xff09;&#xff08;二十五&#xff09; 下一篇&#xff1a;SQLite数据库中JSON 函数和运算符 1…

汇编语言 实验10.1

汇编语言 实验10.1 assume cs:code,ds:datasgdatasg segmentdb welcome to masm!,0 datasg endsstack segmentdw 0,0,0,0,0,0,0,0 stack endscode segment ;代码段start: mov dh,8mov dl,3mov cl,2mov ax,datasgmov ds,axmov si,0call show_strmov ax,4c00h ;程序返回int 21hs…

已经下载了pytorch,但在正确使用一段时间后出现No module named torch的错误

问题描述 使用的是叫做m2release的虚拟环境&#xff0c;在此环境下使用conda list可以发现是存在pytorch的&#xff0c;但是运行代码时却报No module named torch的错误。 解决方案 想尝试卸掉这个pytorch重新装一次&#xff0c;但是想卸载会提示找不到&#xff0c;想重新…

Java八股文4

Linux篇 1.free命令-查看内存状态 free命令用于显示内存状态&#xff0c;它可以提供关于系统内存使用情况的详细信息。这个命令会显示出内存的使用情况&#xff0c;包括实体内存、虚拟的交换文件内存、共享内存区段&#xff0c;以及系统核心使用的缓冲区等。 其中&#xff0c;参…

每三人拥有一辆车!车载工业平板电脑五大硬性要求

在今年7月初&#xff0c;公安部发布2022年上半年全国机动车和驾驶人统计数据&#xff0c;数据显示&#xff0c;截至2022年6月底&#xff0c;全国机动车保有量达4.06亿辆&#xff0c;其中汽车3.10亿辆。此外&#xff0c;目前全国拥有驾驶证的人数高达4.92亿人&#xff0c;其中汽…

一文读懂电阻并联电路和串联电路的特性

电阻并联电路是最基本的并联电路&#xff0c;所有的电路都可以转化为电阻串联电路和电阻并联电路来了解其工作原理。并联电路和串联电路具有完全不同的特性。它们是完全不同的电路&#xff0c;不能相互等效&#xff08;电阻并联电路图&#xff09;。 串联电路 特点与特性&…

探索半导体测试领域:哲讯TCC智能化管理系统的应用与优势

在半导体行业中&#xff0c;封装和测试环节是至关重要的一环。半导体封装测试是指将通过测试的晶圆按照产品型号及功能需求加工得到独立芯片的过程。半导体封测包括封装和测试两个环节&#xff0c;封装是保护芯片免受物理、化学等环境因素造成的损伤&#xff0c;增强芯片的散热…

es安装中文分词器

下载地址&#xff0c;尽量选择和自己本地es差不多的版本 https://github.com/infinilabs/analysis-ik/releases 下载好&#xff0c;解压&#xff0c;把里面的文件放到es的plugins/ik目录下 把plugin-descriptor.properties文件里的es版本改成自己对应的 再启动es&#xff0c;能…

Mamba 学习

Vision Mamba U-Mamba 以后的趋势&#xff1a; 1.Mamba模型机机制上和transform一样&#xff0c;但是参数量上做了改进&#xff0c;可以直接替代 2.vision上可以实时处理

深入剖析跨境电商平台风控机制,探索测评安全与稳定的秘诀

在跨境电商测评市场鱼龙混杂的当下&#xff0c;测评过程中可能隐藏的陷阱保持高度警觉。多年的测评经验告诉我们&#xff0c;选择一个适合的测评系统对于项目的成功至关重要。近年来&#xff0c;测评技术如雨后春笋般涌现&#xff0c;市场上涌现出众多测评系统&#xff0c;覆盖…

Java 的注释

文章目录 java 的注释共有三种形式单行注释多行注释文档注释文档注释的文档需要命令进行生成GBK 不可映射问题 与大多数的编程语言一样&#xff0c;Java 中的注释也不会出现在可执行程序中。 因此我们可以在源程序中根据需要添加任意多的注释&#xff0c;而不必担心可执行代码受…

了解光纤的最大损耗

在电信和数据传输领域&#xff0c;保持最佳的网络性能和可靠性至关重要。 影响网络完整性的关键因素之一是光纤中的信号丢失。信号损耗&#xff0c;也称为衰减损耗或光纤衰减&#xff0c;测量光缆输入和输出之间的光损耗量。本文将深入探讨光纤中的主要损耗&#xff0c;并指导您…

使用yolov5训练自己的目标检测模型

使用yolov5训练自己的目标检测模型 使用yolov5训练自己的目标检测模型1. 项目的克隆2. 项目代码结构3. 环境的安装和依赖的安装4. 数据集和预训练权重的准备4.1利用labelimg标注数据和数据的准备4.1.1 **labelimg介绍:**4.1. 2 labelimg的安装 4.2 使用labelimg4.2.1 数据准备4…

开源在线表单工具 HeyForm 使用教程

HeyForm 是一个非常出色的开源在线表单工具&#xff0c;可以通过直观的拖拽式编辑器&#xff0c;快速构建出美观实用的表单。 HeyForm 的功能非常丰富&#xff1a; 支持丰富的输入类型&#xff0c;从基础的文本、数字到高级的图片选择、日期选择、文件上传等&#xff0c;一应俱…