Spring Boot 3.3.4 升级导致 Logback 之前回滚策略配置不兼容问题解决

前言

在将 Spring Boot 项目升级至 3.3.4 版本后,遇到 Logback 配置的兼容性问题。本文将详细描述该问题的错误信息、原因分析,并提供调整日志回滚策略的解决方案。

错误描述

这是SpringBoot 3.3.3版本之前的回滚策略的配置

    <!-- 日志记录器的滚动策略,按日期,按大小记录 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}.%i.log</fileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>10MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy><!--日志文档保留天数--><maxHistory>30</maxHistory></rollingPolicy>

当 升级至 Spring Boot 3.3.4 版本后,启动时出现以下报错:

Exception in thread "main" java.lang.IllegalStateException: java.lang.IllegalStateException: Logback configuration error detected: 
ERROR in ch.qos.logback.core.model.processor.ImplicitModelHandler - Could not create component [timeBasedFileNamingAndTriggeringPolicy] of type [ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP] java.lang.ClassNotFoundException: ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP
ERROR in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Filename pattern [/logs/app/%d{yyyy-MM-dd}.%i.log] contains an integer token converter, i.e. %i, INCOMPATIBLE with this configuration. Remove it.

主要问题出现在 logback 日志配置的 SizeAndTimeBasedFNATP 类以及日志文件命名中的 %i 令牌使用上。

关键错误信息:
  1. java.lang.ClassNotFoundException: ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP
  2. Filename pattern contains an integer token converter, i.e. %i, INCOMPATIBLE with this configuration

原因分析

在升级 Spring Boot 版本至 3.3.4 后,底层的 Logback 版本也随之更新。在较新的 Logback 版本中,以下变化引发了兼容性问题:

  1. SizeAndTimeBasedFNATP 类弃用

    • 在新的 Logback 版本中,SizeAndTimeBasedFNATP 类已经被移除或不再使用。之前用来支持基于大小和时间的日志滚动的策略必须替换为新的策略类。
    • 此类需要被 SizeAndTimeBasedRollingPolicy 替代,它能够同时支持按文件大小和时间进行日志滚动。
  2. 日志文件命名中的 %i 令牌不兼容

    • 日志文件命名模式中使用的 %i 令牌,用于在日志滚动时生成多个文件(如 log.1, log.2 等),但这与 TimeBasedRollingPolicy 不兼容。TimeBasedRollingPolicy 仅基于时间滚动日志,不支持 %i 分片。

解决方案

调整日志回滚策略

为了解决以上问题,我们需要将原有的 TimeBasedRollingPolicy 替换为新的 SizeAndTimeBasedRollingPolicy,并调整日志文件的命名模式以去除不兼容的 %i 令牌。

配置修改

以下是修改后的 logback-spring.xml 配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- SpringBoot默认logback的配置 --><include resource="org/springframework/boot/logging/logback/defaults.xml"/><springProperty scope="context" name="APP_NAME" source="spring.application.name"/><property name="LOG_HOME" value="/logs/${APP_NAME}"/><!-- 1. 输出到控制台 --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>DEBUG</level></filter><encoder><Pattern>${CONSOLE_LOG_PATTERN}</Pattern><charset>UTF-8</charset></encoder></appender><!-- 2. 输出到文件 --><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_HOME}/log.log</file><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} -%5level ---[%15.15thread] %-40.40logger{39} : %msg%n%n</pattern><charset>UTF-8</charset></encoder><!-- 使用SizeAndTimeBasedRollingPolicy替代旧的策略 --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- 滚动后的日志文件命名模式 --><fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}-%i.log</fileNamePattern><!-- 日志文件的最大大小 --><maxFileSize>10MB</maxFileSize><!-- 最大保留30天的日志 --><maxHistory>30</maxHistory><!-- 总日志文件大小不超过3GB --><totalSizeCap>3GB</totalSizeCap></rollingPolicy><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>INFO</level></filter></appender><!-- 开发环境输出至控制台 --><springProfile name="dev"><root level="INFO"><appender-ref ref="CONSOLE"/></root></springProfile><!-- 生产环境输出至文件 --><springProfile name="prod"><root level="INFO"><appender-ref ref="CONSOLE"/><appender-ref ref="FILE"/></root></springProfile></configuration>
修改内容说明:
  1. 使用 SizeAndTimeBasedRollingPolicy

    • 该策略同时支持按时间和文件大小滚动日志。与旧的 TimeBasedRollingPolicy 类相比,它是更推荐的滚动策略。
  2. 文件命名模式调整

    • fileNamePattern 中,使用 %d{yyyy-MM-dd}-%i.log 作为文件名格式,这允许日志按照日期命名,并在同一天滚动日志时通过 %i 生成分片文件(如 2024-10-01-1.log, 2024-10-01-2.log 等)。
  3. 限制日志大小和保留时间

    • maxFileSize 设置为 10MB,表示单个日志文件的最大大小。
    • maxHistory 设置为 30,表示最多保留30天的日志文件。
    • totalSizeCap 设置为 3GB,表示日志总大小不能超过 3GB。达到该限制时,将删除最早的日志文件。

总结

在 Spring Boot 升级至 3.3.4 后,由于底层 Logback 版本的更新,原先使用的 TimeBasedRollingPolicy 类和日志文件名中的 %i 令牌会引发兼容性问题。通过调整日志回滚策略,使用新的 SizeAndTimeBasedRollingPolicy 并去除不兼容的文件命名模式,可以顺利解决这些问题,使日志系统恢复正常运行。

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

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

相关文章

Vue 3中导航守卫(Navigation Guard)结合Axios实现token认证机制

在Vue 3中&#xff0c;导航守卫&#xff08;Navigation Guard&#xff09;用于拦截路由的变化&#xff0c;可以在用户访问页面前进行检查。结合Axios进行token认证机制时&#xff0c;我们可以通过导航守卫在路由跳转时&#xff0c;检查用户的认证状态&#xff0c;确保用户有有效…

Webrtc (1) - Windows 编译

最近项目上遇到webrtc wgc 的几个test case无法通过&#xff0c;与webrtc人员沟通后决定要自行修复一下(因为他们不想管…) 参考文档 https://webrtc.org/support/contributinghttps://chromium.googlesource.com/chromium/src//main/docs/#checking-out-and-building 以上两…

Python数据类型间的转换及eval函数

1.数据类型间的转换 x 10 y 3 z x / y # 除法运算&#xff0c;将运算的结果赋值给z print(z,type(z)) # 隐式转换&#xff0c;通过运算隐式地传了结果的类型# float类型转换为int类型&#xff0c;只保留整数部分&#xff0c;不会进行四舍五入 print(int(3.1542)) print(i…

influxdb+grafana+jmeter

influxdb influxd先启动 启动完成后执行 influxdb的端口号 grafana的启动 通过grafana-server.exe启动grafana 启动后打开 http://localhost:8087/

GeekHour

Linux Linux的是类Unix系统&#xff0c;作者是Linus&#xff0c;也是git的作者。符合GPL&#xff08;General Public License&#xff09;就可以Linux的使用、修改、再发布。 Linux四部分&#xff1a; 内核&#xff1a;驱动、内存管理、进程管理、文件系统、网络协议栈…。作…

【SpringCloud】黑马微服务学习笔记

目录 1. 关于微服务 ?1.1 微服务与单体架构的区别 ?1.2 SpringCloud 技术 2. 学习前准备 ?2.1 环境搭建 ?2.2 熟悉项目 3. 正式拆分 ?3.1 拆分商品功能模块 ?3.2 拆分购物车功能模块 4. 服务调用 ?4.1 介绍 ?4.2 RustTemplate?的使用 4.3 服务治理-注册中…

安装matlab2024a错误license checkout failed Error-8

问题&#xff1a; 忘记截图了&#xff0c;借用博主的图片。 记得安装过程中&#xff0c;目标网址才是你的安装地址&#xff0c;而不是前面的安装包地址。 解决方法&#xff1a; 1.将破解文件中"Crack\R2020a\bin\win64\matlab_startup_plugins\lmgrimpl"目录下的l…

Spring缓存注解@Cacheable详细介绍和实际使用案例

Cacheable是Spring框架中用于缓存方法返回结果的注解&#xff0c;它可以显著提高应用程序的性能&#xff0c;特别是对于一些计算密集型或频繁调用且结果不经常变化的方法。以下是关于Cacheable的详细介绍&#xff1a; 基本使用 添加依赖&#xff1a;使用Cacheable注解前&…

第10章:Python TDD优化货币类方法与引入工厂方法

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…

解决 Django 5.1 中的 TemplateSyntaxError 错误

解决 Django 5.1 中的 TemplateSyntaxError 错误 在 Django 开发过程中&#xff0c;我们经常会遇到 TemplateSyntaxError 错误&#xff0c;尤其是在模板文件中使用不被支持或错误的模板标签时。最近&#xff0c;我们遇到的一个常见错误是&#xff1a; Invalid block tag on l…

多模态数据有哪些常见类型?从视觉到语言的广泛应用

1. 图像文字&#xff1a;让机器“看懂”世界 这是什么&#xff1f; 机器看一张图片&#xff0c;然后用文字描述出来&#xff0c;比如“这是一只正在奔跑的狗”。 它有什么用&#xff1f; 购物&#xff1a;拍张鞋子的照片&#xff0c;AI能告诉你哪家网店有同款。 辅助盲人&…

【Oracle数据库】创建表的同义词示例

目录 背景创建用户创建基础表及数据创建同义词回收权限删除用户 背景 测试Oracle数据库创建同义词功能。 创建用户 -- 切换到 SYS 用户 CONNECT SYS/your_password AS SYSDBA;-- 创建 HR 用户 CREATE USER HR IDENTIFIED BY hr_password; GRANT DBA TO HR;-- 创建 SCOTT 用户…

【数据库知识】PostgreSQL介绍

PostgreSQL介绍 概述一、起源与发展二、特性与功能三、PL/pgSQL语言四、应用场景五、配置与优化 核心概念一、基础数据结构二、数据操作三、高级特性四、应用场景 多版本控制MVCC说明一、MVCC的基本概念二、MVCC的实现原理三、MVCC的工作流程四、MVCC的优势五、MVCC的局限性 可…

gitlab使用多数据库

1. 说明 默认情况下&#xff0c;GitLab 使用一个单一的应用数据库&#xff0c;称为主数据库。为了扩展 GitLab&#xff0c;您可以将 GitLab 配置为使用多个应用数据库。 设置多个数据库后&#xff0c;GitLab 将使用第二个应用数据库用于 CI/CD 功能&#xff0c;称为 CI 数据库…

常用排序算法之插入排序

目录 前言 一、基本原理 1.算法步骤 2.动画演示 3.插入排序的实现代码 二、插入排序的时间复杂度 1. 时间复杂度 1.最优时间复杂度 2.最差时间复杂度 3.平均时间复杂度 2. 空间复杂度 三、插入排序的优缺点 1.优点 2.缺点 四、插入排序的改进与变种 五、插入排…

【机器学习实战入门】使用OpenCV进行性别和年龄检测

Gender and Age Detection Python 项目 首先,向您介绍用于此高级 Python 项目的性别和年龄检测中的术语: 什么是计算机视觉? 计算机视觉是一门让计算机能够像人类一样观察和识别数字图像和视频的学科。它面临的挑战大多源于对生物视觉有限的了解。计算机视觉涉及获取、处…

python爬虫的学习流程(1-前提准备)

这里主要记录一下我的python爬虫初级的学习的流程 1.python爬虫入门实战课 什么是爬虫&#xff1f;众说纷纭&#xff0c;我们引用维基百科上对网络爬虫的介绍&#xff1a; 网络爬虫&#xff08;英语&#xff1a;Web crawler&#xff09;&#xff0c;也叫网络蜘蛛&#xff08;…

语音技术在播客领域的应用(2)

播客是以语音为主&#xff0c;各种基于AI 的语音技术在播客领域十分重要。 语音转文本 Whisper Whisper 是OpenAI 推出的开源语音辨识工具&#xff0c;可以把音档转成文字&#xff0c;支援超过50 种语言。这款工具是基于68 万小时的训练资料&#xff0c;其中包含11.7 万小时的…

PyTorch使用教程(13)-一文搞定模型的可视化和训练过程监控

一、简介 在现代深度学习的研究和开发中&#xff0c;模型的可视化和监控是不可或缺的一部分。PyTorch&#xff0c;作为一个流行的深度学习框架&#xff0c;通过其丰富的生态系统提供了多种工具来满足这一需求。其中&#xff0c;torch.utils.tensorboard 是一个强大的接口&…

C#语言的学习路线

C#语言的学习路线 C#作为一种现代编程语言&#xff0c;凭借其简洁的语法、强大的功能和广泛的应用&#xff0c;得到了越来越多开发者的青睐。无论是开发桌面应用、Web应用、游戏&#xff0c;还是云服务&#xff0c;C#都有着广泛的应用场景。本文将为有志于学习C#的读者提供一条…