Java中实现按天和文件大小滚动日志,核心是使用Logback的SizeAndTimeBasedRollingPolicy或Log4j2的TimeBased+SizeBased触发策略组合,需配置文件命名含%d与%i、设置maxFileSize、maxHistory及totalSizeCap或Delete清理规则。

Java 中按天和文件大小滚动输出日志,核心是使用 Logback(推荐)或 Log4j2 的滚动策略(RollingPolicy),不能只靠简单的 FileAppender。关键在于组合时间滚动(TimeBasedRollingPolicy)和大小触发滚动(SizeAndTimeBasedRollingPolicy),并合理配置文件命名与保留策略。
Logback:用 SizeAndTimeBasedRollingPolicy 实现双条件滚动
这是最常用、最稳妥的方式,支持“每天生成新文件 + 单个文件超限就切分”。需在 logback.xml 中配置:
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>说明:
-
%d{yyyy-MM-dd}表示按天归档;%i是同一日内因大小触发的序号(如app.2024-06-15.0.log、app.2024-06-15.1.log) -
<maxFileSize>控制单个文件最大体积(默认单位是字节,支持 KB/MB/GB,如100MB) -
<maxHistory>保留最近多少天的历史日志(自动删除过期目录/文件) -
<totalSizeCap>所有归档日志总大小上限,超出时最早文件会被清理
Log4j2:用 DefaultRolloverStrategy + TimeBasedTriggeringPolicy + SizeBasedTriggeringPolicy
Log4j2 需通过组合触发策略实现“时间 + 大小”双条件。配置示例(log4j2.xml):
立即学习“Java免费学习笔记(深入)”;
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/app.%d{yyyy-MM-dd}-%i.log">
<PatternLayout>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %c{1} - %msg%n</pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<DefaultRolloverStrategy max="30">
<Delete basePath="logs" maxDepth="1">
<IfFileName glob="app.*.log" />
<IfLastModified age="30d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>注意点:
- 两个
TriggeringPolicy是“或”关系:满足任一条件即触发滚动(当天内文件超 100MB 就切;没超但到了第二天零点也会切) -
filePattern中%i自动编号,避免同天多文件名冲突 -
DefaultRolloverStrategy max="30"控制归档文件总数;配合<Delete>可更精准清理(如按天删 + 按总大小删)
常见误区和注意事项
- 别用
TimeBasedRollingPolicy单独配大小限制——它不支持maxFileSize,仅按时间切,容易单文件过大 - Logback 的
SizeAndTimeBasedRollingPolicy要求fileNamePattern必须含%d和%i,缺一不可,否则启动报错 - 日志路径(如
logs/)需确保应用有写权限,且磁盘空间充足;建议监控totalSizeCap或Delete策略是否生效 - 开发时可设小值测试(如
maxFileSize="1MB"、maxHistory="3"),验证滚动和清理是否如期发生
不推荐的做法
手动编码判断时间/大小后重置 Logger —— 易出错、线程不安全、破坏框架生命周期管理;或用第三方脚本定时切割 —— 延迟高、可能丢日志、无法精确到行。应始终优先使用日志框架原生滚动能力。


















