应用停机期间未进行日志轮转
我在应用程序中有如下的appender设置,它执行每小时轮转并压缩日志文件:
<appender name="log-file" class="ch.qos.logback.core.rolling.RollingFileAppender">
..
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>log.json.%d{yyyy-MM-dd-HH}.gz</fileNamePattern>
<maxHistory>36</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
会生成类似如下的文件:
log.json.2026-04-14-08.gz
log.json.2026-04-14-09.gz
log.json.2026-04-14-10 <-- currently active file
这项功能运行良好,除了以下场景:
- 假设应用在10:58到 11:02之间宕机(例如因为一次部署)
log.json.2026-04-14-10文件的轮转不会发生,因此不会被压缩成.gz- 在下一次归档清除执行时,这个文件也不会被处理,因为它不匹配
.gz文件扩展名 - 这会导致孤儿文件慢慢占用磁盘空间,而logback没有内置清理
使用 cleanHistoryOnStart 也没用,因为它只会检查按 fileNamePattern 指定的 .gz 文件。
如何处理这些情况?
解决方案
找到了解决办法——你可以在appender中指定 <file>,以设定活动日志文件的名称。这样,应用程序始终使用同一个日志文件,只为归档文件选择一个不同的名称:
<appender name="log-file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>log.json</file> <!-- The important part -->
..
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>log.json.%d{yyyy-MM-dd-HH}.gz</fileNamePattern>
<maxHistory>36</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。