Spring Boot中Logback滚动旧日志文件被截断问题咨询
Logback滚动日志旧文件被清零的原因分析
场景与问题
在Spring Boot应用中使用以下Logback配置后,发现2月8日至12日的日志文件在2月13日被清零,2月13日的日志文件仅包含当日内容,未合并被清零日期的日志。
日志配置
<appender name="IbkrRollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOGS}/ibkr.log</file> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <Pattern>%d %p %C{1.} [%t] %m%n</Pattern> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOGS}/ibkr-%d{yyyy-MM-dd}.%i.log </fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> </appender> <!-- LOG everything at INFO level --> <root level="info"> <appender-ref ref="IbkrRollingFile" /> </root>
日志文件列表
9381 Jan 26 23:45 ibkr-2023-01-26.0.log 17393 Jan 27 23:45 ibkr-2023-01-27.0.log 75651 Jan 30 23:45 ibkr-2023-01-30.0.log 175709 Jan 31 23:45 ibkr-2023-01-31.0.log 194281 Feb 1 23:45 ibkr-2023-02-01.0.log 267280 Feb 2 23:52 ibkr-2023-02-02.0.log 245753 Feb 3 23:34 ibkr-2023-02-03.0.log 118 Feb 4 04:30 ibkr-2023-02-04.0.log 386926 Feb 6 21:58 ibkr-2023-02-06.0.log 415111 Feb 7 23:53 ibkr-2023-02-07.0.log 4300 Feb 9 10:12 pom.xml 0 Feb 13 20:40 ibkr-2023-02-12.0.log 0 Feb 13 20:40 ibkr-2023-02-08.0.log 0 Feb 13 20:40 ibkr-2023-02-11.0.log 0 Feb 13 20:40 ibkr-2023-02-10.0.log 0 Feb 13 20:40 ibkr-2023-02-09.0.log 468100 Feb 13 23:00 ibkr-2023-02-13.0.log 15380 Feb 14 12:20 ibkr.log
原因分析
- 应用重启触发异常滚动:2月13日应用发生了重启,重启前
ibkr.log中累积了2月8日至12日的日志(从文件列表看这几天没有生成对应日期的滚动日志,说明期间日志一直写入主文件ibkr.log,未触发滚动)。重启时Logback会尝试处理主文件中的历史日志,将其拆分到对应日期的文件中。 - 文件名模板格式错误:配置中
<fileNamePattern>标签内的内容末尾带有多余换行,导致Logback解析文件名模板时出现异常,无法正确将历史日志写入对应日期的文件,反而生成了空文件。 - 跨天日志拆分逻辑失败:使用
SizeAndTimeBasedFNATP时,若主文件中包含多天的日志,Logback需要按日志时间戳拆分到对应日期文件。如果期间日志时间戳解析异常、磁盘权限不足或空间不足,会导致拆分失败,仅保留当日日志到新文件,旧日志丢失,同时生成空的历史日期文件。
修复建议
- 修正文件名模板:移除
<fileNamePattern>内的多余换行,确保模板完整:<fileNamePattern>${LOGS}/ibkr-%d{yyyy-MM-dd}.%i.log</fileNamePattern> - 添加日志保留天数限制:在
TimeBasedRollingPolicy中添加maxHistory配置,避免累积过多历史日志:<maxHistory>30</maxHistory> - 确保目录权限:保证应用运行用户对日志目录拥有完整的读写权限,避免文件操作失败。
- 控制启动时历史日志清理:可添加
cleanHistoryOnStart配置(默认false),明确启动时是否清理历史日志,避免误操作:<cleanHistoryOnStart>false</cleanHistoryOnStart>
内容的提问来源于stack exchange,提问作者Kannan J
相关产品推荐
相关产品推荐

