Java日志自动清理核心依赖日志框架配置:Logback用TimeBasedRollingPolicy+maxHistory(如30天),Log4j2用Delete标签按修改时间清理,或Java定时任务遍历删除。

Java 日志定期自动清理过期日志文件,核心不在于 Java 本身,而在于日志框架的归档与清理策略配置。主流方案是使用 Logback(Spring Boot 默认)或 Log4j2,它们原生支持基于时间/大小的滚动归档和自动删除旧日志。
Logback:通过 TimeBasedRollingPolicy + MaxHistory
这是最常用、最可靠的方式。Logback 的 TimeBasedRollingPolicy 按天(或小时)切分日志,配合 maxHistory 参数可自动删除指定天数前的日志文件。
- 确保使用
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> - 设置
<fileNamePattern>包含日期占位符,如app.%d{yyyy-MM-dd}.%i.log(%i支持同天多文件) - 关键:配置
<maxHistory>30</maxHistory>—— 表示只保留最近 30 天的日志,启动或滚动时自动清理过期文件 - 可选增强:
<totalSizeCap>1GB</totalSizeCap>控制所有归档日志总大小上限
Log4j2:用 DefaultRolloverStrategy 的 max 和 delete 规则
Log4j2 更灵活,支持基于条件的精准清理(如按最后修改时间删除)。
- 在
RollingFileAppender中配置DefaultRolloverStrategy - 设置
max="30"限制归档文件数量(配合时间滚动) - 更推荐用
<Delete>标签实现智能清理:
<Delete basePath="${LOG_PATH}" maxDepth="1">
<IfLastModified age="30d"/>
</Delete>
表示:扫描basePath下 1 层目录内的文件,删除最后修改时间超过 30 天的
不依赖框架的轻量方案:Java 定时任务 + 文件遍历
适用于自定义逻辑、老旧系统或日志未走标准框架(如直接写 FileWriter)。
立即学习“Java免费学习笔记(深入)”;
- 用
ScheduledExecutorService或 Spring 的@Scheduled每日执行一次清理任务 - 遍历日志目录,用
Files.getLastModifiedTime(file)获取修改时间 - 对比当前时间,删除早于指定阈值(如
Instant.now().minus(30, ChronoUnit.DAYS))的文件 - 注意:避免误删正在写入的文件(可通过文件名规则或加锁规避)
注意事项与避坑点
-
时区问题:Logback 的
%d{yyyy-MM-dd}默认用 JVM 时区;Log4j2 的age="30d"基于文件系统时间戳,需确保服务器时间准确 - 权限问题:应用进程需对日志目录有读写权限,否则清理会静默失败
- 滚动时机:Logback 在触发滚动时才清理;若日志量极少、长期不滚动,过期文件可能滞留——可配合定时器兜底
-
Spring Boot 配置位置:Logback 对应
logback-spring.xml;Log4j2 对应log4j2-spring.xml,勿放在默认logback.xml中导致 profile 失效


















