本文目录导读:

Java 日志分割通常通过日志框架来实现,最常见的做法是使用 Logback 或 Log4j2,配合框架自带的滚动策略(如基于时间、大小或两者的组合)。
以下是几种主流场景的配置案例:
前提
确保项目中引入了日志框架的依赖(以 Maven 为例):
Logback (Spring Boot 默认):
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
Log4j2 (高性能场景):
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j2-core</artifactId>
</dependency>
Logback 按天滚动 + 大小限制 (最常用)
这是最推荐的方案:每天生成一个日志文件,但如果当天日志超过指定大小(如 100MB),则自动拆分并进行编号。
配置文件 logback-spring.xml (放在 src/main/resources 下):
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 定义日志文件路径和名称 -->
<property name="LOG_PATH" value="./logs" />
<property name="APP_NAME" value="myapp" />
<!-- 1. 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 2. 滚动日志文件(核心配置) -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${APP_NAME}.log</file>
<!-- 滚动策略:基于时间(按天)和大小 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 文件名模式:%d{yyyy-MM-dd} 表示按天 -->
<!-- .%i 表示当天的第几个文件(因为启用了大小限制) -->
<fileNamePattern>${LOG_PATH}/${APP_NAME}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 单个日志文件最大大小 -->
<maxFileSize>100MB</maxFileSize>
<!-- 保留最近 30 天的日志 -->
<maxHistory>30</maxHistory>
<!-- 所有日志文件总大小上限(可选):超过则删除最早的 -->
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 日志级别配置 -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</configuration>
效果:
- 2024-01-01 的日志文件:
myapp.2024-01-01.0.log,myapp.2024-01-01.1.log(如果当天超过100MB) - 超过30天(或总大小超过10GB)的日志自动删除。
Log4j2 按天 + 大小滚动 (高性能场景)
Log4j2 的配置语法不同,但功能类似。
配置文件 log4j2.xml (放在 src/main/resources 下):
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
<Properties>
<Property name="LOG_PATH">./logs</Property>
<Property name="APP_NAME">myapp</Property>
</Properties>
<Appenders>
<!-- 控制台输出 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<!-- 滚动文件输出 -->
<RollingFile name="RollingFile"
fileName="${LOG_PATH}/${APP_NAME}.log"
filePattern="${LOG_PATH}/${APP_NAME}.%d{yyyy-MM-dd}.%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
<!-- 滚动策略:基于时间(按天) -->
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<!-- 大小触发:超过 100 MB 时滚动 -->
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<!-- 最大文件数(保留 30 天) -->
<DefaultRolloverStrategy max="30">
<!-- 可选:限制总大小 -->
<Delete basePath="${LOG_PATH}" maxDepth="1">
<IfFileName glob="*.log.gz" />
<IfLastModified age="30d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
注意:
- 日志文件在滚动后会进行 Gzip 压缩(
.log.gz),节省存储空间。 interval="1"按天滚动,modulate="true"对齐到午夜。
纯按文件大小滚动(不按时间分割)
适用于希望日志文件保持较小体积,不关心日期归档的场景。
Logback 配置(仅修改 rollingPolicy):
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${APP_NAME}.log</file>
<!-- 仅按大小滚动 -->
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>${LOG_PATH}/${APP_NAME}.%i.log</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>10</maxIndex> <!-- 保留 10 个历史文件 -->
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>50MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
效果:
- 生成
myapp.1.log,myapp.2.log... 直到myapp.10.log。 - 超过 10 个文件后,最旧的文件被覆盖(固定窗口滚动)。
总结建议
| 场景 | 推荐配置 |
|---|---|
| 生产环境通用 | 案例一 (Logback + SizeAndTimeBasedRollingPolicy) |
| 高性能/低延迟 | 案例二 (Log4j2 + Gzip 压缩) |
| 仅控制大小 | 案例三 (FixedWindow + SizeBased) |
| 仅控制天数(不关心大小) | Logback:TimeBasedRollingPolicy;Log4j2:移除 SizeBasedTriggeringPolicy |
关键配置解释:
%d{yyyy-MM-dd}:日志文件名按日期分割。%i:当文件达到大小上限时,自动生成序号(如.0,.1)。maxHistory/max:控制日志保留天数,防止磁盘空间被占满。totalSizeCap/Delete:控制总存储上限,更彻底的空间管理。