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):
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
<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 手动实现(适合轻量/定制场景)
若不能引入日志框架,需自行控制文件切换逻辑。关键点:
- 维护一个 当前有效日期字符串(如 "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></timebasedtriggeringpolicy><sizebasedtriggeringpolicy size="100 MB"></sizebasedtriggeringpolicy></policies><defaultrolloverstrategy max="30"><delete basepath="logs/" maxdepth="1"><iffilename glob="app.log.*.zip"></iffilename><iflastmodified age="30d"></iflastmodified></delete></defaultrolloverstrategy></rollingfile>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










