Java中日志按天和按大小切割应使用Logback或Log4j2内置滚动策略:Logback用TimeBasedRollingPolicy配合SizeAndTimeBasedFNATP,Log4j2用TimeBasedTriggeringPolicy与SizeBasedTriggeringPolicy组合,均支持双条件触发、自动命名、归档清理及压缩扩展。

Java 中按天和按大小切割日志文件,核心是借助成熟的日志框架(如 Logback 或 Log4j2)的内置滚动策略,不建议手动实现。手动管理文件创建、重命名、压缩、清理容易出错且难以维护。
用 Logback 实现按天 + 按大小双条件滚动
Logback 的 TimeBasedRollingPolicy 支持时间维度,配合 SizeAndTimeBasedFNATP(文件名激活与触发策略)可同时满足“每天一个文件”和“单个文件不超过指定大小”的要求。
- 在
logback.xml中配置如下:
<file>logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
-
%d{yyyy-MM-dd}控制按天生成新文件名;%i是索引,当日日志超限时自动追加.0、.1等后缀(如app.2024-06-15.0.log) -
<maxFileSize>10MB</maxFileSize>表示单个文件达到 10MB 就切分,但不会跨天——当天的多个分片共享同一个日期标识 -
<maxHistory>30</maxHistory>保留最近 30 天的归档文件;<totalSizeCap>1GB</totalSizeCap>控制所有归档总大小上限,超出时自动删除最旧文件
Log4j2 的等效配置方式
Log4j2 使用 DefaultRolloverStrategy + TimeBasedTriggeringPolicy 和 SizeBasedTriggeringPolicy 组合,支持“或”逻辑触发滚动(任一条件满足即切分)。
- 在
log4j2.xml中配置:
filePattern="logs/app.%d{yyyy-MM-dd}-%i.log">
<PatternLayout>
<Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %c{36} - %msg%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<DefaultRolloverStrategy max="30">
<Delete basePath="logs" maxDepth="1">
<IfFileName glob="app.*.log" />
<IfLastModified age="30d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
-
filePattern中的%d{yyyy-MM-dd}实现按天分目录或命名;%i自动编号应对同天多文件 - 两个
TriggeringPolicy并列,表示“每天零点切”或“当前文件满 10MB 就切”,满足任一即触发 -
DefaultRolloverStrategy的max="30"限制最多保留 30 个归档;配合<Delete>可做更精细的清理(如按天+按大小双重清理)
不推荐的手动切割方案
自行用 FileOutputStream + 定时任务判断时间/大小来切换文件,存在明显缺陷:
立即学习“Java免费学习笔记(深入)”;
- 多线程环境下文件句柄竞争易导致写入丢失或异常
- 无法原子性完成“写满 → 关闭 → 重命名 → 新建”全过程,可能破坏日志完整性
- 缺少压缩(.zip/.gz)、异步刷盘、错误降级等生产级能力
- 时间判断依赖系统时钟,未考虑时区、夏令时、NTP 同步偏差等问题
关键注意事项
- 确保日志路径(如
logs/)所在磁盘有足够空间,否则滚动失败可能导致日志丢失 - 测试时把
maxFileSize设小(如 1KB),快速验证滚动行为是否符合预期 - 若需压缩归档,Logback 加
<triggeringPolicy>+<compressionMode>zip</compressionMode>;Log4j2 需配合ZipArchiveEntry插件或外部脚本 - Spring Boot 项目默认使用 Logback,直接放
logback-spring.xml即可生效,优先级高于logback.xml


















