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>
相关推荐
伯明翰java6 小时前
【无标题】springboot项目yml中使用中文注释报错的解决方法
java·spring boot·后端
码界奇点6 小时前
基于Spring Boot和Vue.js的视频点播管理系统设计与实现
java·vue.js·spring boot·后端·spring·毕业设计·源代码管理
廋到被风吹走6 小时前
【Spring】Spring Boot详细介绍
java·spring boot·spring
czlczl200209256 小时前
基于 Spring Boot 权限管理 RBAC 模型
前端·javascript·spring boot
计算机毕设指导66 小时前
基于微信小程序的智慧社区娱乐服务管理系统【源码文末联系】
java·spring boot·微信小程序·小程序·tomcat·maven·娱乐
汽车仪器仪表相关领域6 小时前
ZDT-III 通用电机测试系统
数据库·算法·单元测试·压力测试·可用性测试
赵得C7 小时前
Spring Boot+MyBatis:用 PageHelper 实现 Oracle 12c 的 OFFSET 分页
spring boot·oracle·mybatis
enjoy编程7 小时前
Spring Boot 4 如何使用Sentinel进行限流?
spring boot·sentinel·限流·熔断降级·流量控制·服务限流·系统负载保护
码界奇点7 小时前
基于Spring Boot和Vue.js的房屋出租管理系统设计与实现
vue.js·spring boot·后端·车载系统·毕业设计·源代码管理
幽络源小助理8 小时前
SpringBoot国内旅游景点数据爬虫与可视化分析系统源码 – JavaWeb项目分享
spring boot·后端·爬虫