Java日志分割案例如何配置

wen java案例 26

本文目录导读:

Java日志分割案例如何配置

  1. 案例一:Logback 按天滚动 + 大小限制 (最常用)
  2. 案例二:Log4j2 按天 + 大小滚动 (高性能场景)
  3. 案例三:纯按文件大小滚动(不按时间分割)
  4. 总结建议

Java 日志分割通常通过日志框架来实现,最常见的做法是使用 LogbackLog4j2,配合框架自带的滚动策略(如基于时间、大小或两者的组合)。

以下是几种主流场景的配置案例:

前提

确保项目中引入了日志框架的依赖(以 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:控制总存储上限,更彻底的空间管理。

抱歉,评论功能暂时关闭!