Spring Boot 2.7.18(最终 2.x 系列版本)8 - 日志:Log4j2 基本概念;Log4j2 多环境日志配置策略

Spring Boot 2.7.18(最终 2.x 系列版本)8 - 日志:Log4j2 基本概念;Log4j2 多环境日志配置策略

Spring Boot 2.7.18(最终 2.x 系列版本)8 - 日志


日志配置

在企业级 Java 应用中,日志不仅用于排查问题,也用于业务监控、性能分析和审计。不同环境(开发、测试、生产)的日志需求各不相同:

  • 开发环境:需要详细调试信息(DEBUG/TRACE),同时希望在控制台可见。
  • 测试环境:日志比开发环境少,但需要持久化到文件,以便排查问题。
  • 生产环境:日志主要关注 WARN/ERROR,日志文件需要按日期和大小滚动,保证长期可追溯,同时避免占满磁盘。

本文将详细讲解如何使用 Log4j2 配置多环境日志,以及如何管理滚动文件和日志级别。

1. Log4j2 基本概念

Log4j2 主要由以下几个部分组成:

  • Logger:日志记录器,用于在代码中调用日志方法。
  • Appender:日志输出器,决定日志输出到控制台、文件或远程系统。
  • Layout:日志输出格式,例如普通文本、JSON。
  • Filter:日志过滤器,用于控制哪些日志可以输出。

日志级别优先级(高到低):

OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL


2. Log4j2 多环境日志配置策略

不同环境可以使用不同配置文件,例如:

环境 文件名 输出 日志级别
开发 log4j2-spring-dev.xml 控制台 + 测试文件 DEBUG
测试 log4j2-spring-test.xml 文件输出 INFO
生产 log4j2-spring-prod.xml 滚动文件 INFO/WARN/ERROR

优点

  • 配置独立,互不影响
  • 无需在同一文件中使用条件判断
  • 环境切换简单:通过 Spring Boot 的 spring.profiles.active 配合 logging.config 指定对应的配置文件,例如:
yaml 复制代码
spring:
  profiles:
    active: dev  # 当前激活环境
logging:
  config: classpath:log/log4j2-spring-${spring.profiles.active}.xml

Spring Boot 会根据 ${spring.profiles.active} 自动加载对应的 Log4j2 配置文件,实现多环境日志配置。


3. 配置实践

修改配置文件
yaml 复制代码
spring:
  application:
    name: spring-boot-demo-2.7.18
  profiles:
    active: dev
  config:
    # 导入连接池配置
    import: datasource/datasource-${spring.profiles.active}.yml
logging:
  config: classpath:log/log4j2-spring-${spring.profiles.active}.xml
log4j2-spring-dev.xml
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!--
    ==========================================================
    Log4j2 日志配置
    ==========================================================
    日志级别优先级(高到低):
    OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL
    - OFF:关闭日志
    - FATAL:严重错误,系统崩溃
    - ERROR:业务错误,可继续运行
    - WARN:警告信息
    - INFO:一般信息
    - DEBUG:开发调试
    - TRACE:最详细日志
    - ALL:记录所有日志
-->

<!--
    configuration:Log4j2 根节点,全局配置
    属性:
    - status:Log4j2 内部日志级别
        可选值:
        OFF | FATAL | ERROR | WARN | INFO | DEBUG | TRACE
    - monitorInterval:配置热加载间隔(秒),0表示禁用
    - packages:自定义插件扫描包
-->
<configuration status="WARN" monitorInterval="30">

    <!-- ==========================================================
         一、Appender(日志输出器)
         ==========================================================
         Appender 定义日志输出目标及格式
         常用类型:
         - Console:输出到控制台
         - File:普通文件
         - RollingFile:支持按时间/大小滚动
    -->
    <appenders>

        <!-- ===================== 控制台输出(开发专用) ===================== -->
        <Console name="Console" target="SYSTEM_OUT">
            <!-- PatternLayout 定义日志输出格式 -->
            <!--
                常用占位符:
                %d{yyyy-MM-dd HH:mm:ss.SSS} 时间
                %pid 进程ID
                %t/%T 线程名/线程ID
                %X{traceId}, %X{spanId} MDC 链路追踪
                %level 日志级别
                %c 类名
                %msg 日志内容
                %throwable 异常堆栈
            -->
            <PatternLayout
                    pattern="%style{[%d{yyyy-MM-dd HH:mm:ss.SSS}]}{CYAN} %style{[PID=%pid]}{MAGENTA} %style{[thread=%t, id=%T]}{BLUE} %style{[traceId=%X{traceId}, spanId=%X{spanId}]}{BLUE} %highlight{%style{[%level]}{BRIGHT}} %style{---}{DEFAULT} %highlight{%style{%c}{BRIGHT}} : %msg%n%throwable"
                    disableAnsi="false"
                    noConsoleNoAnsi="false"
                    charset="UTF-8"/>
            <!-- ThresholdFilter 过滤日志级别 -->
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
        </Console>

        <!-- ===================== 测试文件输出(调试专用) ===================== -->
        <File name="Test" fileName="logs/test.log" append="false" bufferedIO="true" immediateFlush="true">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>

        <!-- ======================= INFO 日志滚动文件 ======================= -->
        <RollingFile name="RollingFileInfo"
                     fileName="logs/info.log"
                     filePattern="logs/%d{yyyy-MM-dd}/info-%i.log.gz">
            <!-- 仅记录 INFO 及以下级别 -->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [thread=%t, id=%T] [traceId=%X{traceId}, spanId=%X{spanId}] - %c - %m%n"/>
            <Policies>
                <!-- 每天凌晨滚动 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!-- 文件超过 100MB 自动滚动 -->
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <!-- 每天最多保留 5 个文件,超出删除最旧 -->
            <DefaultRolloverStrategy max="5"/>
        </RollingFile>

        <!-- ======================= WARN 日志滚动文件 ======================= -->
        <RollingFile name="RollingFileWarn"
                     fileName="logs/warn.log"
                     filePattern="logs/%d{yyyy-MM-dd}/warn-%i.log.gz">
            <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [thread=%t, id=%T] [traceId=%X{traceId}, spanId=%X{spanId}] - %c - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="5"/>
        </RollingFile>

        <!-- ======================= ERROR 日志滚动文件 ======================= -->
        <RollingFile name="RollingFileError"
                     fileName="logs/error.log"
                     filePattern="logs/%d{yyyy-MM-dd}/error-%i.log.gz">
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [thread=%t, id=%T] [traceId=%X{traceId}, spanId=%X{spanId}] - %c - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="5"/>
        </RollingFile>

    </appenders>

    <!-- ==========================================================
         二、Logger(日志记录器)
         ==========================================================
         Logger 定义不同包/类的日志输出规则
    -->
    <loggers>

        <!-- ======================= 第三方包日志过滤 ======================= -->
        <logger name="com.alibaba" level="WARN"/>
        <logger name="com.baomidou" level="WARN"/>
        <logger name="com.ulisesbocchio.jasyptspringboot" level="WARN"/>
        <logger name="springfox.documentation" level="WARN"/>
        <logger name="org.hibernate.validator" level="ERROR"/>

        <!-- ======================= 根日志器 ======================= -->
        <!-- Root Logger:全局日志入口 -->
        <!--
            属性:
            - level:全局日志输出级别
              可选值:TRACE, DEBUG, INFO, WARN, ERROR, FATAL, ALL, OFF
            - additivity:是否继承父 Logger(默认 true)
        -->
        <root level="all">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
            <appender-ref ref="Test"/>
        </root>

    </loggers>

</configuration>
log4j2-spring-test.xml
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!--
    ==========================================================
    Log4j2 日志配置
    ==========================================================
    日志级别优先级(高到低):
    OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL
    - OFF:关闭日志
    - FATAL:严重错误,系统崩溃
    - ERROR:业务错误,可继续运行
    - WARN:警告信息
    - INFO:一般信息
    - DEBUG:开发调试
    - TRACE:最详细日志
    - ALL:记录所有日志
-->

<!--
    configuration:Log4j2 根节点,全局配置
    属性:
    - status:Log4j2 内部日志级别
        可选值:
        OFF | FATAL | ERROR | WARN | INFO | DEBUG | TRACE
    - monitorInterval:配置热加载间隔(秒),0表示禁用
    - packages:自定义插件扫描包
-->
<configuration status="WARN" monitorInterval="30">

    <!-- ==========================================================
         一、Appender(日志输出器)
         ==========================================================
         Appender 定义日志输出目标及格式
         常用类型:
         - Console:输出到控制台
         - File:普通文件
         - RollingFile:支持按时间/大小滚动
    -->
    <appenders>

        <!-- ===================== 控制台输出(开发专用) ===================== -->
        <Console name="Console" target="SYSTEM_OUT">
            <!-- PatternLayout 定义日志输出格式 -->
            <!--
                常用占位符:
                %d{yyyy-MM-dd HH:mm:ss.SSS} 时间
                %pid 进程ID
                %t/%T 线程名/线程ID
                %X{traceId}, %X{spanId} MDC 链路追踪
                %level 日志级别
                %c 类名
                %msg 日志内容
                %throwable 异常堆栈
            -->
            <PatternLayout
                    pattern="%style{[%d{yyyy-MM-dd HH:mm:ss.SSS}]}{CYAN} %style{[PID=%pid]}{MAGENTA} %style{[thread=%t, id=%T]}{BLUE} %style{[traceId=%X{traceId}, spanId=%X{spanId}]}{BLUE} %highlight{%style{[%level]}{BRIGHT}} %style{---}{DEFAULT} %highlight{%style{%c}{BRIGHT}} : %msg%n%throwable"
                    disableAnsi="false"
                    noConsoleNoAnsi="false"
                    charset="UTF-8"/>
            <!-- ThresholdFilter 过滤日志级别 -->
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
        </Console>

        <!-- ===================== 测试文件输出(调试专用) ===================== -->
        <File name="Test" fileName="logs/test.log" append="false" bufferedIO="true" immediateFlush="true">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>

        <!-- ======================= INFO 日志滚动文件 ======================= -->
        <RollingFile name="RollingFileInfo"
                     fileName="logs/info.log"
                     filePattern="logs/%d{yyyy-MM-dd}/info-%i.log.gz">
            <!-- 仅记录 INFO 及以下级别 -->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [thread=%t, id=%T] [traceId=%X{traceId}, spanId=%X{spanId}] - %c - %m%n"/>
            <Policies>
                <!-- 每天凌晨滚动 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!-- 文件超过 100MB 自动滚动 -->
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <!-- 每天最多保留 5 个文件,超出删除最旧 -->
            <DefaultRolloverStrategy max="5"/>
        </RollingFile>

        <!-- ======================= WARN 日志滚动文件 ======================= -->
        <RollingFile name="RollingFileWarn"
                     fileName="logs/warn.log"
                     filePattern="logs/%d{yyyy-MM-dd}/warn-%i.log.gz">
            <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [thread=%t, id=%T] [traceId=%X{traceId}, spanId=%X{spanId}] - %c - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="5"/>
        </RollingFile>

        <!-- ======================= ERROR 日志滚动文件 ======================= -->
        <RollingFile name="RollingFileError"
                     fileName="logs/error.log"
                     filePattern="logs/%d{yyyy-MM-dd}/error-%i.log.gz">
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [thread=%t, id=%T] [traceId=%X{traceId}, spanId=%X{spanId}] - %c - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="5"/>
        </RollingFile>

    </appenders>

    <!-- ==========================================================
         二、Logger(日志记录器)
         ==========================================================
         Logger 定义不同包/类的日志输出规则
    -->
    <loggers>

        <!-- ======================= 第三方包日志过滤 ======================= -->
        <logger name="com.alibaba" level="WARN"/>
        <logger name="com.baomidou" level="WARN"/>
        <logger name="com.ulisesbocchio.jasyptspringboot" level="WARN"/>
        <logger name="springfox.documentation" level="WARN"/>
        <logger name="org.hibernate.validator" level="ERROR"/>

        <!-- ======================= 根日志器 ======================= -->
        <!-- Root Logger:全局日志入口 -->
        <!--
            属性:
            - level:全局日志输出级别
              可选值:TRACE, DEBUG, INFO, WARN, ERROR, FATAL, ALL, OFF
            - additivity:是否继承父 Logger(默认 true)
        -->
        <root level="all">
<!--            <appender-ref ref="Console"/>-->
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
            <appender-ref ref="Test"/>
        </root>

    </loggers>

</configuration>
log4j2-spring-prod.xml
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!--
    ==========================================================
    Log4j2 日志配置
    ==========================================================
    日志级别优先级(高到低):
    OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL
    - OFF:关闭日志
    - FATAL:严重错误,系统崩溃
    - ERROR:业务错误,可继续运行
    - WARN:警告信息
    - INFO:一般信息
    - DEBUG:开发调试
    - TRACE:最详细日志
    - ALL:记录所有日志
-->

<!--
    configuration:Log4j2 根节点,全局配置
    属性:
    - status:Log4j2 内部日志级别
        可选值:
        OFF | FATAL | ERROR | WARN | INFO | DEBUG | TRACE
    - monitorInterval:配置热加载间隔(秒),0表示禁用
    - packages:自定义插件扫描包
-->
<configuration status="WARN" monitorInterval="30">

    <!-- ==========================================================
         一、Appender(日志输出器)
         ==========================================================
         Appender 定义日志输出目标及格式
         常用类型:
         - Console:输出到控制台
         - File:普通文件
         - RollingFile:支持按时间/大小滚动
    -->
    <appenders>

        <!-- ===================== 控制台输出(开发专用) ===================== -->
        <Console name="Console" target="SYSTEM_OUT">
            <!-- PatternLayout 定义日志输出格式 -->
            <!--
                常用占位符:
                %d{yyyy-MM-dd HH:mm:ss.SSS} 时间
                %pid 进程ID
                %t/%T 线程名/线程ID
                %X{traceId}, %X{spanId} MDC 链路追踪
                %level 日志级别
                %c 类名
                %msg 日志内容
                %throwable 异常堆栈
            -->
            <PatternLayout
                    pattern="%style{[%d{yyyy-MM-dd HH:mm:ss.SSS}]}{CYAN} %style{[PID=%pid]}{MAGENTA} %style{[thread=%t, id=%T]}{BLUE} %style{[traceId=%X{traceId}, spanId=%X{spanId}]}{BLUE} %highlight{%style{[%level]}{BRIGHT}} %style{---}{DEFAULT} %highlight{%style{%c}{BRIGHT}} : %msg%n%throwable"
                    disableAnsi="false"
                    noConsoleNoAnsi="false"
                    charset="UTF-8"/>
            <!-- ThresholdFilter 过滤日志级别 -->
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
        </Console>

        <!-- ===================== 测试文件输出(调试专用) ===================== -->
        <File name="Test" fileName="logs/test.log" append="false" bufferedIO="true" immediateFlush="true">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>

        <!-- ======================= INFO 日志滚动文件 ======================= -->
        <RollingFile name="RollingFileInfo"
                     fileName="logs/info.log"
                     filePattern="logs/%d{yyyy-MM-dd}/info-%i.log.gz">
            <!-- 仅记录 INFO 及以下级别 -->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [thread=%t, id=%T] [traceId=%X{traceId}, spanId=%X{spanId}] - %c - %m%n"/>
            <Policies>
                <!-- 每天凌晨滚动 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!-- 文件超过 100MB 自动滚动 -->
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <!-- 每天最多保留 5 个文件,超出删除最旧 -->
            <DefaultRolloverStrategy max="5"/>
        </RollingFile>

        <!-- ======================= WARN 日志滚动文件 ======================= -->
        <RollingFile name="RollingFileWarn"
                     fileName="logs/warn.log"
                     filePattern="logs/%d{yyyy-MM-dd}/warn-%i.log.gz">
            <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [thread=%t, id=%T] [traceId=%X{traceId}, spanId=%X{spanId}] - %c - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="5"/>
        </RollingFile>

        <!-- ======================= ERROR 日志滚动文件 ======================= -->
        <RollingFile name="RollingFileError"
                     fileName="logs/error.log"
                     filePattern="logs/%d{yyyy-MM-dd}/error-%i.log.gz">
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [thread=%t, id=%T] [traceId=%X{traceId}, spanId=%X{spanId}] - %c - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="5"/>
        </RollingFile>

    </appenders>

    <!-- ==========================================================
         二、Logger(日志记录器)
         ==========================================================
         Logger 定义不同包/类的日志输出规则
    -->
    <loggers>

        <!-- ======================= 第三方包日志过滤 ======================= -->
        <logger name="com.alibaba" level="WARN"/>
        <logger name="com.baomidou" level="WARN"/>
        <logger name="com.ulisesbocchio.jasyptspringboot" level="WARN"/>
        <logger name="springfox.documentation" level="WARN"/>
        <logger name="org.hibernate.validator" level="ERROR"/>

        <!-- ======================= 根日志器 ======================= -->
        <!-- Root Logger:全局日志入口 -->
        <!--
            属性:
            - level:全局日志输出级别
              可选值:TRACE, DEBUG, INFO, WARN, ERROR, FATAL, ALL, OFF
            - additivity:是否继承父 Logger(默认 true)
        -->
        <root level="all">
<!--            <appender-ref ref="Console"/>-->
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
<!--            <appender-ref ref="Test"/>-->
        </root>

    </loggers>

</configuration>
相关推荐
q***49862 小时前
Spring Boot 3.4 正式发布,结构化日志!
java·spring boot·后端
Sunlightʊə6 小时前
2.登录页测试用例
运维·服务器·前端·功能测试·单元测试
刘一说8 小时前
Spring Boot 应用的指标收集与监控体系构建指南
java·spring boot·后端
weixin_436525079 小时前
SpringBoot 单体服务集成 Zipkin 实现链路追踪
java·spring boot·后端
q***74810 小时前
Spring Boot环境配置
java·spring boot·后端
q***420510 小时前
在Spring Boot项目中使用MySQL数据库
数据库·spring boot·mysql
superlls10 小时前
(Spring)Spring Boot 自动装配原理总结
java·spring boot·spring
郝开11 小时前
Spring Boot 2.7.18(最终 2.x 系列版本)3 - 枚举规范定义:定义基础枚举接口;定义枚举工具类;示例枚举
spring boot·后端·python·枚举·enum