应用停机期间未进行日志轮转

后端开发 2026-07-10

我在应用程序中有如下的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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章