Java中实现日志按大小切分,核心是使用Logback或Log4j2等框架的滚动策略:Logback用SizeAndTimeBasedRollingPolicy(设maxFileSize、totalSizeCap),Log4j2用SizeBasedTriggeringPolicy配合DefaultRolloverStrategy,均需避免手动编码。

Java 中实现按大小切分日志文件,核心是使用支持滚动策略的日志框架(如 Logback 或 Log4j2),配置基于文件大小的滚动策略,而非手动编码控制。
使用 Logback(推荐)
Logback 是 SLF4J 的原生实现,内置 SizeAndTimeBasedRollingPolicy 和更轻量的 SizeBasedTriggeringPolicy,适合纯大小切分。
- 在
logback.xml中配置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>10MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
说明:
- <maxFileSize>10MB</maxFileSize>:单个日志文件达到 10MB 后触发切分;
- %i 是递增索引(如 app.2024-05-01.0.log、.1.log),配合时间戳避免冲突;
- <totalSizeCap> 控制所有归档日志总大小上限,超出时自动删除最旧文件。
使用 Log4j2
Log4j2 通过 SizeBasedTriggeringPolicy + DefaultRolloverStrategy 实现大小切分。
- 配置示例(
log4j2.xml):
<RollingFile name="RollingFile" fileName="logs/app.log"
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>
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<DefaultRolloverStrategy max="30">
<Delete basePath="logs/" maxDepth="1">
<IfFileName glob="app.*.log"/>
<IfLastModified age="30d"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
注意:
- size="10 MB"(带空格)是合法格式,单位支持 KB/MB/GB;
- max="30" 表示最多保留 30 个归档文件;
- 删除策略可按时间或数量清理,避免磁盘占满。
不建议的手动实现方式
有人尝试用 File.length() 在每次写入前判断大小并重命名文件,但存在明显问题:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 多线程下文件长度检查与写入非原子操作,可能超限;
- 无法保证日志不丢失或重复;
- 需自行管理文件名序列、归档、清理逻辑,易出错且维护成本高。
除非有极特殊限制(如禁用第三方日志框架),否则应交由成熟框架处理。
关键配置要点
无论选 Logback 还是 Log4j2,以下几点直接影响切分行为:
-
单位大小要写对:Logback 写
10MB(无空格),Log4j2 写10 MB(有空格); - 归档路径需有写权限,且磁盘空间充足;
- 避免多个 JVM 实例共用同一日志文件,否则滚动行为不可控;
- 测试时可用小值(如
1KB)快速验证切分是否生效。

















