Logback实现日志按天归档压缩的核心是TimeBasedRollingPolicy,通过fileNamePattern指定%d{yyyy-MM-dd}.%i.gz格式,配合maxHistory控制保留天数并自动清理。

Java 中实现日志文件按天归档与压缩,核心思路是:在每天首次写入日志前检查当前日志文件名是否匹配当天日期;若不匹配,则将旧文件重命名归档(可选压缩),再创建新日志文件。不依赖外部框架也能实现,但推荐使用成熟日志库(如 Logback 或 Log4j2)——它们内置了 TimeBasedRollingPolicy 和 SizeAndTimeBasedRollingPolicy,天然支持按天切分、自动压缩(zip/gz)、保留策略等。
用 Logback 实现按天归档+压缩(推荐方案)
Logback 是 SLF4J 的原生实现,配置简洁、性能好、功能全。只需在 logback.xml 中配置 RollingFileAppender:
- 使用 TimeBasedRollingPolicy 按天触发归档
- 设置 fileNamePattern 指定归档路径和格式(含日期占位符 %d 和压缩后缀 .%i.gz)
- 启用 triggeringPolicy + SizeBasedTriggeringPolicy 可同时按大小+时间滚动(防单日日志过大)
- 通过 maxHistory 控制保留多少天的归档文件(自动清理过期压缩包)
示例配置(每天生成一个 app.log.2024-05-20.zip):
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app.log.%d{yyyy-MM-dd}.%i.zip</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>纯 Java 手动实现(适合轻量/定制场景)
若不能引入日志框架,需自行控制文件切换逻辑。关键点:
立即学习“Java免费学习笔记(深入)”;
- 维护一个 当前有效日期字符串(如 "2024-05-20"),每次写日志前用
LocalDate.now().toString()比较 - 不一致时,关闭原
FileWriter/BufferedWriter,调用Files.move()重命名旧文件(如app.log → app.log.2024-05-19) - 用
ZipOutputStream将归档文件压缩为 .zip(注意:压缩后建议删除原始未压缩文件) - 重新打开新文件
app.log继续写入 - 务必加锁(如
synchronized或ReentrantLock)避免多线程下日期判断与文件操作错乱
注意事项与避坑点
-
时区问题:系统默认时区可能影响日期判断,建议显式使用
ZoneId.systemDefault()或固定时区(如ZoneId.of("Asia/Shanghai")) - 压缩性能开销:高频写日志场景中,每次归档都同步压缩会影响吞吐,可改为异步压缩(如提交到线程池)或仅归档不压缩,定期批量处理
-
文件名冲突:同一秒内多次滚动?用
%i索引(Logback)或添加毫秒/随机数后缀避免覆盖 - 磁盘空间保护:必须配置保留天数或总大小上限,否则长期运行会撑爆磁盘
Log4j2 的等效配置(备选)
若项目已用 Log4j2,对应配置为 TimeBasedTriggeringPolicy + DefaultRolloverStrategy,并指定 fileIndex="nomax" 和 compressionLevel="9" 启用 zip 压缩:
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/app.log.%d{yyyy-MM-dd}.%i.zip">
<PatternLayout>
<Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<DefaultRolloverStrategy max="30">
<Delete basePath="logs/" maxDepth="1">
<IfFileName glob="app.log.*.zip" />
<IfLastModified age="30d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>


















