同时使用两种Logback滚动策略导致Spring Boot启动失败
解决方案
你的配置逻辑有误,SizeAndTimeBasedRollingPolicy本身就是TimeBasedRollingPolicy的子类,它原生支持按时间+文件大小双维度滚动日志,不需要嵌套在TimeBasedRollingPolicy里作为触发策略使用。这种嵌套写法会导致Logback初始化时无法正确读取fileNamePattern参数,从而抛出异常。
正确的配置方式是直接将rollingPolicy的类指定为SizeAndTimeBasedRollingPolicy,同时注意修改fileNamePattern,添加%i占位符来区分同一天内生成的多个按大小分割的日志文件(比如同天内文件超过10MB时,会生成access-2024-10-01.0.log、access-2024-10-01.1.log这类文件)。
完整的logback-access.xml配置如下:
<configuration> <appender name="ACCESS_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 活跃日志文件路径 --> <file>logs/access.log</file> <!-- 直接使用SizeAndTimeBasedRollingPolicy实现双维度滚动 --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 文件名模板,%i用于区分同天内的多份日志 --> <fileNamePattern>logs/access-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 日志保留天数 --> <maxHistory>30</maxHistory> <!-- 单文件最大容量 --> <maxFileSize>10MB</maxFileSize> <!-- 可选:设置总日志文件的最大容量,超过后会删除旧日志 --> <!-- <totalSizeCap>1GB</totalSizeCap> --> </rollingPolicy> <!-- 访问日志格式编码器 --> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="ch.qos.logback.access.PatternLayout"> <pattern>%h %l %u [%t] "%r" %s %b %D %I</pattern> </layout> </encoder> </appender> <appender-ref ref="ACCESS_FILE" /> </configuration>
关键说明
- 移除了嵌套的
timeBasedFileNamingAndTriggeringPolicy节点,直接用SizeAndTimeBasedRollingPolicy作为滚动策略 fileNamePattern必须添加%i,否则同天内按大小分割的日志会覆盖之前的文件- 可选配置
totalSizeCap可以限制所有归档日志的总大小,避免磁盘被占满
内容的提问来源于stack exchange,提问作者Timothy Clotworthy
相关产品推荐
相关产品推荐

