Spring Boot 日志配置详解:log4j2.xml 的完整配置指南

在现代企业级应用开发中,日志管理是系统运维和问题排查的重要组成部分。本文将详细介绍如何在 Spring Boot 项目中配置 Log4j2,包括完整的 [log4j2.xml]配置文件和相关依赖设置。

一、为什么选择 Log4j2?

Spring Boot 默认使用 Logback 作为日志框架,但在某些场景下我们更倾向于使用 Log4j2:

  1. 性能优势:Log4j2 使用异步日志记录,在高并发环境下性能表现更优
  2. 无锁设计:采用 LMAX Disruptor 库实现无锁异步日志记录
  3. 灵活配置:支持更丰富的日志过滤和格式化选项
  4. 动态更新:配置文件修改后无需重启应用即可生效

二、Maven 依赖配置

1. 排除默认日志框架

首先需要排除 Spring Boot 默认的 Logback 依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

2. 添加 Log4j2 依赖

然后添加 Log4j2 相关依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

<!-- 高性能异步日志库 -->
<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
    <version>3.4.4</version>
</dependency>

三、application.yml 配置

在 [application-pre.yml] 文件中指定日志配置文件:

yaml 复制代码
logging:
  config: classpath:log4j2.xml

这样配置可以让 Spring Boot 加载自定义的 Log4j2 配置文件。

3、log4j2.xml 完整配置详解

1. Properties 属性定义

xml 复制代码
<Properties>
    <property name="LOG_HOME" value="/home/test/doc/log"/>
    <property name="APP_CODE" value="file_log"/>
    <property name="LOG_LEVEL_PATTERN" value="%-5p"/>
    <property name="INSTANCE_INFO_PATTERN" value="${hostName} | ${sys:user.name}"/>
    <property name="CODE_INFO_PATTERN" value="%pid:%F:%L"/>
    <property name="LOG_DATEFORMAT_PATTERN" value="yyyy-MM-dd HH:mm:ss.SSS"/>
    <property name="APP_LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}} | ${LOG_LEVEL_PATTERN} | %X{TRACE_ID}  | %t | ${CODE_INFO_PATTERN} | [%X{seq}] - %m%n"/>
    <property name="LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}} | %X{TRACE_ID} | ${LOG_LEVEL_PATTERN} | ${INSTANCE_INFO_PATTERN} | FEIA | FLEP-INAPP | %t | ${CODE_INFO_PATTERN} | %m%n"/>
    <property name="ALERT_LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}} $${ctx:traceId:-} | ${INSTANCE_INFO_PATTERN} | [%X{seq}] - %m%n"/>
</Properties>

这里定义了日志系统的各种属性,包括日志存储路径、日志级别格式、实例信息格式等。

2. Appenders 输出配置

控制台输出配置
xml 复制代码
<Console name="Console" target="SYSTEM_OUT" follow="true">
    <PatternLayout pattern="%d{${LOG_DATEFORMAT_PATTERN}} | ${LOG_LEVEL_PATTERN} | %t | %c:%L | [%X{seq}] - %m%n" />
</Console>
文件滚动策略配置

Log4j2 支持多种滚动策略,以下是一些常用配置:

事件日志配置

xml 复制代码
<RollingFile name="EventLogFile" fileName="${LOG_HOME}/event.log" immediateFlush="true"
             filePattern="${LOG_HOME}/%d{yyyyMMdd}/event.log.%i">
    <PatternLayout>
        <Pattern>${LOG_PATTERN}</Pattern>
    </PatternLayout>
    <Policies>
        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
        <SizeBasedTriggeringPolicy size="50MB"/>
    </Policies>
    <DefaultRolloverStrategy>
        <Delete basePath="${LOG_HOME}" maxDepth="2">
            <IfFileName glob="*/event.log.*" />
            <IfLastModified age="30d" />
        </Delete>
    </DefaultRolloverStrategy>
</RollingFile>

应用日志配置

xml 复制代码
<RollingFile name="AppLogFile" fileName="${LOG_HOME}/app.log" immediateFlush="true"
             filePattern="${LOG_HOME}/%d{yyyyMMdd}/app.log.%i">
    <PatternLayout>
        <Pattern>${APP_LOG_PATTERN}</Pattern>
    </PatternLayout>
    <Policies>
        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
        <SizeBasedTriggeringPolicy size="50MB"/>
    </Policies>
    <DefaultRolloverStrategy>
        <Delete basePath="${LOG_HOME}" maxDepth="2">
            <IfFileName glob="*/app.log.*" />
            <IfLastModified age="30d" />
        </Delete>
    </DefaultRolloverStrategy>
</RollingFile>

告警日志配置

xml 复制代码
<RollingFile name="AlertLogFile" fileName="${LOG_HOME}/alert.log" immediateFlush="true"
             filePattern="${LOG_HOME}/%d{yyyyMMdd}/alert.log.%i">
    <thresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
    <PatternLayout>
        <Pattern>${ALERT_LOG_PATTERN}</Pattern>
    </PatternLayout>
    <Policies>
        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
        <SizeBasedTriggeringPolicy size="50MB"/>
    </Policies>
    <DefaultRolloverStrategy>
        <Delete basePath="${LOG_HOME}" maxDepth="2">
            <IfFileName glob="*/alert.log.*" />
            <IfLastModified age="30d" />
        </Delete>
    </DefaultRolloverStrategy>
</RollingFile>

错误日志配置

xml 复制代码
<RollingFile name="ErrorLogFile" fileName="${LOG_HOME}/error.log" immediateFlush="true"
             filePattern="${LOG_HOME}/%d{yyyyMMdd}/error.log.%i">
    <thresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
    <PatternLayout>
        <Pattern>${APP_LOG_PATTERN}</Pattern>
    </PatternLayout>
    <Policies>
        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
        <SizeBasedTriggeringPolicy size="50MB"/>
    </Policies>
    <DefaultRolloverStrategy>
        <Delete basePath="${LOG_HOME}" maxDepth="2">
            <IfFileName glob="*/error.log.*" />
            <IfLastModified age="30d" />
        </Delete>
    </DefaultRolloverStrategy>
</RollingFile>

3. Loggers 日志记录器配置

Root Logger 配置
xml 复制代码
<Root level="INFO">
    <AppenderRef ref="Console" />
    <AppenderRef ref="AppLogFile" />
    <AppenderRef ref="AlertLogFile" />
    <AppenderRef ref="ErrorLogFile" />
</Root>
异步日志记录器配置
xml 复制代码
<AsyncLogger name="event" level="ALL" additivity="false">
    <AppenderRef ref="EventLogFile" />
</AsyncLogger>
特定包的日志级别配置
xml 复制代码
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<logger name="com.cisdi.colmet.core.mapper" level="DEBUG"/>

3. Loggers 日志记录器配置

1. 异步日志配置

为了获得更好的性能,可以使用异步日志记录:

  • 在根节点添加 packages="com.lmax.disruptor" 属性
  • 使用 <AsyncLogger><AsyncRoot> 进行异步日志记录

2. 日志追踪ID配置

配置中的 %X{TRACE_ID} 允许在日志中加入分布式追踪ID,方便问题定位。

3. 文件清理策略

配置中的 <Delete> 元素定义了日志文件的自动清理策略,保留最近30天的日志文件。

4. 性能优化建议

  1. 合理设置日志级别,避免输出过多调试信息
  2. 使用异步日志记录提高性能
  3. 合理设置日志文件大小和保留策略
  4. 定期监控日志磁盘使用情况

4、log4j2.xml 完整配置

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="600">

    <Properties>
        <!--<property name="LOG_HOME" value="${sys:user.home}/home/logs"/>-->
        <!--<property name="LOG_HOME" value="D:\doc\log"/>-->

        <property name="LOG_HOME" value="./logs"/>
        <property name="APP_CODE" value="file_log"/>
        <property name="LOG_LEVEL_PATTERN" value="%-5p"/>
        <property name="INSTANCE_INFO_PATTERN" value="${hostName} | ${sys:user.name}"/>
        <property name="CODE_INFO_PATTERN" value="%pid:%F:%L"/>
        <property name="LOG_DATEFORMAT_PATTERN" value="yyyy-MM-dd HH:mm:ss.SSS"/>
        <property name="APP_LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}} | ${LOG_LEVEL_PATTERN} | %X{TRACE_ID}  | %t | ${CODE_INFO_PATTERN} | [%X{seq}] - %m%n"/>
        <property name="LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}} | %X{TRACE_ID} | ${LOG_LEVEL_PATTERN} | ${INSTANCE_INFO_PATTERN} | FEIA | FLEP-INAPP | %t | ${CODE_INFO_PATTERN} | %m%n"/>
        <property name="ALERT_LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}} $${ctx:traceId:-} | ${INSTANCE_INFO_PATTERN} | [%X{seq}] - %m%n"/>
    </Properties>

    <Appenders>
        <!--控制台输出的相关配置-->
        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="%d{${LOG_DATEFORMAT_PATTERN}} | ${LOG_LEVEL_PATTERN} | %t | %c:%L | [%X{seq}] - %m%n" />
        </Console>
        <!--打印所有的info及以下的级别的信息,每次超过size,则这size大小的日志会自动存入年份-月份创建的文件夹下进行压缩存档-->
        <RollingFile name="EventLogFile" fileName="${LOG_HOME}/event.log" immediateFlush="true"
                     filePattern="${LOG_HOME}/%d{yyyyMMdd}/event.log.%i">
            <PatternLayout>
                <Pattern>${LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="50MB"/>
            </Policies>
            <!--保留最近30天的日志-->
            <DefaultRolloverStrategy>
                <Delete basePath="${LOG_HOME}" maxDepth = "2">
                    <IfFileName glob = "*/event.log.*" />
                    <IfLastModified age = "30d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
        <RollingFile name="AppLogFile" fileName="${LOG_HOME}/app.log" immediateFlush="true"
                     filePattern="${LOG_HOME}/%d{yyyyMMdd}/app.log.%i">
            <PatternLayout>
                <Pattern>${APP_LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="50MB"/>
            </Policies>
            <!--保留最近30天的日志-->
            <DefaultRolloverStrategy>
                <Delete basePath="${LOG_HOME}" maxDepth = "2">
                    <IfFileName glob = "*/app.log.*" />
                    <IfLastModified age = "30d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
        <RollingFile name="AlertLogFile" fileName="${LOG_HOME}/alert.log" immediateFlush="true"
                     filePattern="${LOG_HOME}/%d{yyyyMMdd}/alert.log.%i">
            <thresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout>
                <Pattern>${ALERT_LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="50MB"/>
            </Policies>
            <DefaultRolloverStrategy>
                <Delete basePath="${LOG_HOME}" maxDepth = "2">
                    <IfFileName glob = "*/alert.log.*" />
                    <IfLastModified age = "30d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
        <RollingFile name="ErrorLogFile" fileName="${LOG_HOME}/error.log" immediateFlush="true"
                     filePattern="${LOG_HOME}/%d{yyyyMMdd}/error.log.%i">
            <thresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout>
                <Pattern>${APP_LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="50MB"/>
            </Policies>
            <DefaultRolloverStrategy>
                <Delete basePath="${LOG_HOME}" maxDepth = "2">
                    <IfFileName glob = "*/error.log.*" />
                    <IfLastModified age = "30d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
    </Appenders>

    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="Console" />
            <AppenderRef ref="AppLogFile" />
            <AppenderRef ref="AlertLogFile" />
            <AppenderRef ref="ErrorLogFile" />
        </Root>
        <AsyncLogger name="event" level="ALL" additivity="false">
            <AppenderRef ref="EventLogFile" />
        </AsyncLogger>

        <logger name="com.apache.ibatis" level="TRACE"/>
        <logger name="java.sql.Connection" level="DEBUG"/>
        <logger name="java.sql.Statement" level="DEBUG"/>
        <logger name="java.sql.PreparedStatement" level="DEBUG"/>
        <logger name="com.cisdi.colmet.core.mapper" level="DEBUG"/>
    </Loggers>

</Configuration>

五、总结

通过以上配置,我们可以构建一个功能完善、性能优异的 Log4j2 日志系统。这种配置不仅满足了日常开发和运维需求,还提供了高性能的异步日志记录能力。在实际项目中,可以根据具体需求调整日志级别、输出格式和文件策略,以达到最佳的监控和维护效果。

记住,良好的日志配置是系统稳定运行和快速排错的重要保障,合理的日志管理策略能够显著提升系统的可维护性和可观测性。

相关推荐
BlockChain8882 小时前
SpringBoot实战一:10分钟搭建企业级用户管理系统(20000字完整项目)
java·spring boot·后端
拽着尾巴的鱼儿2 小时前
Springboot 缓存@Cacheable 使用
spring boot·后端·缓存
麦兜*2 小时前
SpringBoot Profile多环境配置详解,一套配置应对所有场景
java·数据库·spring boot
像少年啦飞驰点、3 小时前
Java大厂面试真题:Spring Boot + Kafka + Redis 在电商场景下的实战应用
java·spring boot·redis·分布式·kafka·面试题·电商秒杀
ITUnicorn3 小时前
【Vue2+SpringBoot在线商城】13-本项目运用到的技术
java·spring boot·redis·后端
空空kkk3 小时前
Spring Boot项目的搭建
java·spring boot·后端
熊出没3 小时前
关于MyBatis Mapper 接口与 XML 映射机制的分析
xml·microsoft·mybatis
每天学习一丢丢3 小时前
Spring Boot 调用泛微 E9 Token 认证 + 创建流程完整教程
java·spring boot·后端