跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Spring Boot 中 Log4j2 日志配置指南

介绍如何在 Spring Boot 项目中配置 Log4j2。步骤包括排除默认 Logback 依赖、引入 Log4j2 与 Disruptor 依赖、配置 application.yml 加载自定义 XML,以及编写包含控制台、文件滚动、异步日志及错误分级的 log4j2.xml 配置。该方案支持动态更新、分布式追踪 ID 及日志自动清理,适用于高并发企业级应用。

极客工坊发布于 2026/3/22更新于 2026/5/2045 浏览
Spring Boot 中 Log4j2 日志配置指南

Spring Boot 中 Log4j2 日志配置指南

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

一、为什么选择 Log4j2?

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

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

二、Maven 依赖配置

1. 排除默认日志框架

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

<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 相关依赖:

<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.yml 文件中指定日志配置文件:

logging:
  config: classpath:log4j2.xml

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

四、log4j2.xml 完整配置详解

1. Properties 属性定义

<Properties>
    <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>

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

2. 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>
文件滚动策略配置

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

事件日志配置:

<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>

应用日志配置:

<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>

告警日志配置:

<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>

3. Loggers 日志记录器配置

Root Logger 配置
<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"/>
性能优化建议
  1. 合理设置日志级别,避免输出过多调试信息
  2. 使用异步日志记录提高性能
  3. 合理设置日志文件大小和保留策略
  4. 定期监控日志磁盘使用情况

五、完整配置示例

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="600">
    <Properties>
        <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>
        <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>
        <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>
        <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 日志系统。这种配置不仅满足了日常开发和运维需求,还提供了高性能的异步日志记录能力。在实际项目中,可以根据具体需求调整日志级别、输出格式和文件策略,以达到最佳的监控和维护效果。

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

目录

  1. Spring Boot 中 Log4j2 日志配置指南
  2. 一、为什么选择 Log4j2?
  3. 二、Maven 依赖配置
  4. 1. 排除默认日志框架
  5. 2. 添加 Log4j2 依赖
  6. 三、application.yml 配置
  7. 四、log4j2.xml 完整配置详解
  8. 1. Properties 属性定义
  9. 2. Appenders 输出配置
  10. 控制台输出配置
  11. 文件滚动策略配置
  12. 3. Loggers 日志记录器配置
  13. Root Logger 配置
  14. 异步日志记录器配置
  15. 特定包的日志级别配置
  16. 性能优化建议
  17. 五、完整配置示例
  18. 六、总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • DeepSeek 架构理解与应用分析
  • AI 生成前端 UI 的三步优化技巧
  • Arrow 游戏叙事工具:三大实战场景与可视化创作
  • 2026 年免费及低成本 AI 算力渠道指南与 OpenClaw 配置
  • Android 中高级开发核心面试题库:Java、架构与算法详解
  • 缓存算法 LRU 与 LFU 详解
  • MambaRefine-YOLO:一种用于无人机影像的双模态小目标检测器
  • 互联网就业寒冬下 Android 开发如何提升竞争力与薪资
  • 适合程序员的兼职方式与收入分析
  • GLM-OCR 实战:手写会议纪要转结构化待办与时间线
  • Java 位运算算法题目练习
  • C++ ODB 数据库 ORM 框架详解
  • Python Web 开发与爬虫方向如何选择
  • Flutter 基础组件:BottomNavigationBar 与 TabBar 多页切换及鸿蒙适配
  • AI-Goofish-Monitor:基于 AI 与 Playwright 的闲鱼商品智能监控工具
  • 商汤开源 SenseNova-MARS 模型:实现多模态搜索推理新突破
  • 深度学习激活函数完全指南:Sigmoid、Tanh、ReLU 及现代变体
  • 二叉树深度优先搜索技巧:计算布尔值与路径数字之和
  • B/S 架构详解:现代 Web 应用的核心模式
  • 数组连续和问题:计算和大于等于 x 的区间数量

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online