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

📅 发布时间:2026/7/6 22:31:30 👁️ 浏览次数:
Spring Boot 3.3.4 升级导致 Logback 之前回滚策略配置不兼容问题解决
前言在将 Spring Boot 项目升级至 3.3.4 版本后遇到 Logback 配置的兼容性问题。本文将详细描述该问题的错误信息、原因分析并提供调整日志回滚策略的解决方案。错误描述这是SpringBoot 3.3.3版本之前的回滚策略的配置!-- 日志记录器的滚动策略按日期按大小记录 -- rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicy fileNamePattern${LOG_HOME}/%d{yyyy-MM-dd}.%i.log/fileNamePattern timeBasedFileNamingAndTriggeringPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedFNATP maxFileSize10MB/maxFileSize /timeBasedFileNamingAndTriggeringPolicy !--日志文档保留天数-- maxHistory30/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令牌使用上。关键错误信息java.lang.ClassNotFoundException: ch.qos.logback.core.rolling.SizeAndTimeBasedFNATPFilename pattern contains an integer token converter, i.e. %i, INCOMPATIBLE with this configuration原因分析在升级 Spring Boot 版本至 3.3.4 后底层的 Logback 版本也随之更新。在较新的 Logback 版本中以下变化引发了兼容性问题SizeAndTimeBasedFNATP类弃用在新的 Logback 版本中SizeAndTimeBasedFNATP类已经被移除或不再使用。之前用来支持基于大小和时间的日志滚动的策略必须替换为新的策略类。此类需要被SizeAndTimeBasedRollingPolicy替代它能够同时支持按文件大小和时间进行日志滚动。日志文件命名中的%i令牌不兼容日志文件命名模式中使用的%i令牌用于在日志滚动时生成多个文件如log.1,log.2等但这与TimeBasedRollingPolicy不兼容。TimeBasedRollingPolicy仅基于时间滚动日志不支持%i分片。解决方案调整日志回滚策略为了解决以上问题我们需要将原有的TimeBasedRollingPolicy替换为新的SizeAndTimeBasedRollingPolicy并调整日志文件的命名模式以去除不兼容的%i令牌。配置修改以下是修改后的logback-spring.xml配置?xml version1.0 encodingUTF-8? configuration !-- SpringBoot默认logback的配置 -- include resourceorg/springframework/boot/logging/logback/defaults.xml/ springProperty scopecontext nameAPP_NAME sourcespring.application.name/ property nameLOG_HOME value/logs/${APP_NAME}/ !-- 1. 输出到控制台 -- appender nameCONSOLE classch.qos.logback.core.ConsoleAppender filter classch.qos.logback.classic.filter.ThresholdFilter levelDEBUG/level /filter encoder Pattern${CONSOLE_LOG_PATTERN}/Pattern charsetUTF-8/charset /encoder /appender !-- 2. 输出到文件 -- appender nameFILE classch.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 charsetUTF-8/charset /encoder !-- 使用SizeAndTimeBasedRollingPolicy替代旧的策略 -- rollingPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy !-- 滚动后的日志文件命名模式 -- fileNamePattern${LOG_HOME}/%d{yyyy-MM-dd}-%i.log/fileNamePattern !-- 日志文件的最大大小 -- maxFileSize10MB/maxFileSize !-- 最大保留30天的日志 -- maxHistory30/maxHistory !-- 总日志文件大小不超过3GB -- totalSizeCap3GB/totalSizeCap /rollingPolicy filter classch.qos.logback.classic.filter.ThresholdFilter levelINFO/level /filter /appender !-- 开发环境输出至控制台 -- springProfile namedev root levelINFO appender-ref refCONSOLE/ /root /springProfile !-- 生产环境输出至文件 -- springProfile nameprod root levelINFO appender-ref refCONSOLE/ appender-ref refFILE/ /root /springProfile /configuration修改内容说明使用SizeAndTimeBasedRollingPolicy该策略同时支持按时间和文件大小滚动日志。与旧的TimeBasedRollingPolicy类相比它是更推荐的滚动策略。文件命名模式调整在fileNamePattern中使用%d{yyyy-MM-dd}-%i.log作为文件名格式这允许日志按照日期命名并在同一天滚动日志时通过%i生成分片文件如2024-10-01-1.log,2024-10-01-2.log等。限制日志大小和保留时间maxFileSize设置为 10MB表示单个日志文件的最大大小。maxHistory设置为 30表示最多保留30天的日志文件。totalSizeCap设置为 3GB表示日志总大小不能超过 3GB。达到该限制时将删除最早的日志文件。总结在 Spring Boot 升级至 3.3.4 后由于底层 Logback 版本的更新原先使用的TimeBasedRollingPolicy类和日志文件名中的%i令牌会引发兼容性问题。通过调整日志回滚策略使用新的SizeAndTimeBasedRollingPolicy并去除不兼容的文件命名模式可以顺利解决这些问题使日志系统恢复正常运行。