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

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

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

logging:config: classpath:log4j2.xml 

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

3、log4j2.xml 完整配置详解

1. Properties 属性定义

<Properties><propertyname="LOG_HOME"value="/home/test/doc/log"/><propertyname="APP_CODE"value="file_log"/><propertyname="LOG_LEVEL_PATTERN"value="%-5p"/><propertyname="INSTANCE_INFO_PATTERN"value="${hostName} | ${sys:user.name}"/><propertyname="CODE_INFO_PATTERN"value="%pid:%F:%L"/><propertyname="LOG_DATEFORMAT_PATTERN"value="yyyy-MM-dd HH:mm:ss.SSS"/><propertyname="APP_LOG_PATTERN"value="%d{${LOG_DATEFORMAT_PATTERN}} | ${LOG_LEVEL_PATTERN} | %X{TRACE_ID} | %t | ${CODE_INFO_PATTERN} | [%X{seq}] - %m%n"/><propertyname="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"/><propertyname="ALERT_LOG_PATTERN"value="%d{${LOG_DATEFORMAT_PATTERN}} $${ctx:traceId:-} | ${INSTANCE_INFO_PATTERN} | [%X{seq}] - %m%n"/></Properties>

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

2. Appenders 输出配置

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

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

事件日志配置

<RollingFilename="EventLogFile"fileName="${LOG_HOME}/event.log"immediateFlush="true"filePattern="${LOG_HOME}/%d{yyyyMMdd}/event.log.%i"><PatternLayout><Pattern>${LOG_PATTERN}</Pattern></PatternLayout><Policies><TimeBasedTriggeringPolicyinterval="1"modulate="true"/><SizeBasedTriggeringPolicysize="50MB"/></Policies><DefaultRolloverStrategy><DeletebasePath="${LOG_HOME}"maxDepth="2"><IfFileNameglob="*/event.log.*"/><IfLastModifiedage="30d"/></Delete></DefaultRolloverStrategy></RollingFile>

应用日志配置

<RollingFilename="AppLogFile"fileName="${LOG_HOME}/app.log"immediateFlush="true"filePattern="${LOG_HOME}/%d{yyyyMMdd}/app.log.%i"><PatternLayout><Pattern>${APP_LOG_PATTERN}</Pattern></PatternLayout><Policies><TimeBasedTriggeringPolicyinterval="1"modulate="true"/><SizeBasedTriggeringPolicysize="50MB"/></Policies><DefaultRolloverStrategy><DeletebasePath="${LOG_HOME}"maxDepth="2"><IfFileNameglob="*/app.log.*"/><IfLastModifiedage="30d"/></Delete></DefaultRolloverStrategy></RollingFile>

告警日志配置

<RollingFilename="AlertLogFile"fileName="${LOG_HOME}/alert.log"immediateFlush="true"filePattern="${LOG_HOME}/%d{yyyyMMdd}/alert.log.%i"><thresholdFilterlevel="warn"onMatch="ACCEPT"onMismatch="DENY"/><PatternLayout><Pattern>${ALERT_LOG_PATTERN}</Pattern></PatternLayout><Policies><TimeBasedTriggeringPolicyinterval="1"modulate="true"/><SizeBasedTriggeringPolicysize="50MB"/></Policies><DefaultRolloverStrategy><DeletebasePath="${LOG_HOME}"maxDepth="2"><IfFileNameglob="*/alert.log.*"/><IfLastModifiedage="30d"/></Delete></DefaultRolloverStrategy></RollingFile>

错误日志配置

<RollingFilename="ErrorLogFile"fileName="${LOG_HOME}/error.log"immediateFlush="true"filePattern="${LOG_HOME}/%d{yyyyMMdd}/error.log.%i"><thresholdFilterlevel="error"onMatch="ACCEPT"onMismatch="DENY"/><PatternLayout><Pattern>${APP_LOG_PATTERN}</Pattern></PatternLayout><Policies><TimeBasedTriggeringPolicyinterval="1"modulate="true"/><SizeBasedTriggeringPolicysize="50MB"/></Policies><DefaultRolloverStrategy><DeletebasePath="${LOG_HOME}"maxDepth="2"><IfFileNameglob="*/error.log.*"/><IfLastModifiedage="30d"/></Delete></DefaultRolloverStrategy></RollingFile>

3. Loggers 日志记录器配置

Root Logger 配置
<Rootlevel="INFO"><AppenderRefref="Console"/><AppenderRefref="AppLogFile"/><AppenderRefref="AlertLogFile"/><AppenderRefref="ErrorLogFile"/></Root>
异步日志记录器配置
<AsyncLoggername="event"level="ALL"additivity="false"><AppenderRefref="EventLogFile"/></AsyncLogger>
特定包的日志级别配置
<loggername="com.apache.ibatis"level="TRACE"/><loggername="java.sql.Connection"level="DEBUG"/><loggername="java.sql.Statement"level="DEBUG"/><loggername="java.sql.PreparedStatement"level="DEBUG"/><loggername="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 version="1.0" encoding="UTF-8"?><Configurationstatus="WARN"monitorInterval="600"><Properties><!--<property name="LOG_HOME" value="${sys:user.home}/home/logs"/>--><!--<property name="LOG_HOME" value="D:\doc\log"/>--><propertyname="LOG_HOME"value="./logs"/><propertyname="APP_CODE"value="file_log"/><propertyname="LOG_LEVEL_PATTERN"value="%-5p"/><propertyname="INSTANCE_INFO_PATTERN"value="${hostName} | ${sys:user.name}"/><propertyname="CODE_INFO_PATTERN"value="%pid:%F:%L"/><propertyname="LOG_DATEFORMAT_PATTERN"value="yyyy-MM-dd HH:mm:ss.SSS"/><propertyname="APP_LOG_PATTERN"value="%d{${LOG_DATEFORMAT_PATTERN}} | ${LOG_LEVEL_PATTERN} | %X{TRACE_ID} | %t | ${CODE_INFO_PATTERN} | [%X{seq}] - %m%n"/><propertyname="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"/><propertyname="ALERT_LOG_PATTERN"value="%d{${LOG_DATEFORMAT_PATTERN}} $${ctx:traceId:-} | ${INSTANCE_INFO_PATTERN} | [%X{seq}] - %m%n"/></Properties><Appenders><!--控制台输出的相关配置--><Consolename="Console"target="SYSTEM_OUT"follow="true"><PatternLayoutpattern="%d{${LOG_DATEFORMAT_PATTERN}} | ${LOG_LEVEL_PATTERN} | %t | %c:%L | [%X{seq}] - %m%n"/></Console><!--打印所有的info及以下的级别的信息,每次超过size,则这size大小的日志会自动存入年份-月份创建的文件夹下进行压缩存档--><RollingFilename="EventLogFile"fileName="${LOG_HOME}/event.log"immediateFlush="true"filePattern="${LOG_HOME}/%d{yyyyMMdd}/event.log.%i"><PatternLayout><Pattern>${LOG_PATTERN}</Pattern></PatternLayout><Policies><TimeBasedTriggeringPolicyinterval="1"modulate="true"/><SizeBasedTriggeringPolicysize="50MB"/></Policies><!--保留最近30天的日志--><DefaultRolloverStrategy><DeletebasePath="${LOG_HOME}"maxDepth="2"><IfFileNameglob="*/event.log.*"/><IfLastModifiedage="30d"/></Delete></DefaultRolloverStrategy></RollingFile><RollingFilename="AppLogFile"fileName="${LOG_HOME}/app.log"immediateFlush="true"filePattern="${LOG_HOME}/%d{yyyyMMdd}/app.log.%i"><PatternLayout><Pattern>${APP_LOG_PATTERN}</Pattern></PatternLayout><Policies><TimeBasedTriggeringPolicyinterval="1"modulate="true"/><SizeBasedTriggeringPolicysize="50MB"/></Policies><!--保留最近30天的日志--><DefaultRolloverStrategy><DeletebasePath="${LOG_HOME}"maxDepth="2"><IfFileNameglob="*/app.log.*"/><IfLastModifiedage="30d"/></Delete></DefaultRolloverStrategy></RollingFile><RollingFilename="AlertLogFile"fileName="${LOG_HOME}/alert.log"immediateFlush="true"filePattern="${LOG_HOME}/%d{yyyyMMdd}/alert.log.%i"><thresholdFilterlevel="warn"onMatch="ACCEPT"onMismatch="DENY"/><PatternLayout><Pattern>${ALERT_LOG_PATTERN}</Pattern></PatternLayout><Policies><TimeBasedTriggeringPolicyinterval="1"modulate="true"/><SizeBasedTriggeringPolicysize="50MB"/></Policies><DefaultRolloverStrategy><DeletebasePath="${LOG_HOME}"maxDepth="2"><IfFileNameglob="*/alert.log.*"/><IfLastModifiedage="30d"/></Delete></DefaultRolloverStrategy></RollingFile><RollingFilename="ErrorLogFile"fileName="${LOG_HOME}/error.log"immediateFlush="true"filePattern="${LOG_HOME}/%d{yyyyMMdd}/error.log.%i"><thresholdFilterlevel="error"onMatch="ACCEPT"onMismatch="DENY"/><PatternLayout><Pattern>${APP_LOG_PATTERN}</Pattern></PatternLayout><Policies><TimeBasedTriggeringPolicyinterval="1"modulate="true"/><SizeBasedTriggeringPolicysize="50MB"/></Policies><DefaultRolloverStrategy><DeletebasePath="${LOG_HOME}"maxDepth="2"><IfFileNameglob="*/error.log.*"/><IfLastModifiedage="30d"/></Delete></DefaultRolloverStrategy></RollingFile></Appenders><Loggers><Rootlevel="INFO"><AppenderRefref="Console"/><AppenderRefref="AppLogFile"/><AppenderRefref="AlertLogFile"/><AppenderRefref="ErrorLogFile"/></Root><AsyncLoggername="event"level="ALL"additivity="false"><AppenderRefref="EventLogFile"/></AsyncLogger><loggername="com.apache.ibatis"level="TRACE"/><loggername="java.sql.Connection"level="DEBUG"/><loggername="java.sql.Statement"level="DEBUG"/><loggername="java.sql.PreparedStatement"level="DEBUG"/><loggername="com.cisdi.colmet.core.mapper"level="DEBUG"/></Loggers></Configuration>

五、总结

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

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

Read more

AiOnly大模型深度测评:调用GPT-5 API+RAG知识库,快速构建智能客服机器人

AiOnly大模型深度测评:调用GPT-5 API+RAG知识库,快速构建智能客服机器人

声明:本测试报告系作者基于个人兴趣及使用场景开展的非专业测评,测试过程中所涉及的方法、数据及结论均为个人观点,不代表任何官方立场或行业标准。 引言 AI 技术加速渗透各行各业的今天,你是否也面临这样的困境:想调用 GPT-5、Claude4.5等顶尖模型却被海外注册、跨平台适配搞得焦头烂额?想快速搭建智能客服、内容生成工具,却因模型接口差异、成本不可控而望而却步?或是作为中小团队,既想享受 AI 红利,又受限于技术门槛和预算压力? AiOnly平台的出现,正是为了打破这些壁垒。 本文将从实战角度出发,带你全方位解锁这个「全球顶尖大模型 MaaS 平台」:从 5 分钟完成注册到 API 密钥创建,从单模型调用到融合 RAG 知识库的智能体开发,然后手把手教你在 Windows 环境部署一个日均成本不足 0.5 元的电商客服机器人。无论你是 AI 开发者、企业运营者,还是想低成本尝试 AI

By Ne0inhk
win11本地部署openclaw实操第2集-让小龙虾具有telegram机器人能力和搜索网站能力

win11本地部署openclaw实操第2集-让小龙虾具有telegram机器人能力和搜索网站能力

1 按照第一集的部署完成后,我们就开始考虑给小龙虾增加telegram机器人和搜索网站能力,实现效果如下: 2 telegram机器人能力部署 C:\Users\Administrator.openclaw的配置文件openclaw.json 增加一段内容 "channels":{"telegram":{"enabled": true, "dmPolicy":"pairing", "botToken":"你的telegram机器人的token", "groupPolicy":"allowlist", "streamMode":"partial", "network":{"

By Ne0inhk
【Nginx】——从0到1,带你玩转Nginx,掌握其中的技巧以及配置

【Nginx】——从0到1,带你玩转Nginx,掌握其中的技巧以及配置

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大三学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL,Java基础,Rust】 🎈热门专栏:🎊【Python,Javaweb,Springboot】  感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️ 目录 🎈概念 🎈下载 🎈上传安装 ✨开始安装 ✨ 目录结构 🎈 常用命令  ✨ 开启nginx  ✨ 看一下文件日志  ✨ 重新加载配置文件 ✨ 配置文件  🎈 配置文件结构 🎈具体应用 ✨ 部署静态资源 ✨ 反向代理 ✨ 负载均衡 🎈概念         Nginx(engine x)由俄罗斯的程序设计师Igor Sysoev所开发,官方测试显示Nginx能够支撑高达5万并发连接数。Nginx不仅可以作为HTTP服务器使用,处理静态页面或支持FastCGI、SCGI、uWSGI等协议的动态语言,还能充当反向代理服务器,实现负载均衡,以及提供IMAP/

By Ne0inhk
【MySQL】从连接数据库开始:JDBC 编程入门指南

【MySQL】从连接数据库开始:JDBC 编程入门指南

个人主页:♡喜欢做梦 欢迎  👍点赞  ➕关注  ❤️收藏  💬评论 目录 🌟一、什么是JDBC? 🌟二、JDBC编程的步骤 ✨使用步骤 ✨DriverManger 💫定义 💫DriverManger的主要功能 💫DriverManger的核心方法 💫使用 ✨DataSource 💥定义 💥使用  💥代码优化 ✨DriverManger和DataSource的区别 🌟一、什么是JDBC? JDBC(Java Data Base Connectivity,Java数据库连接)是Java程序和数据库之间的桥梁,也就是Java语言操作数据库的标准API,他提供了一套用于执行SQL语句的Java接口。JDBC的主要作用就是:与数据库连接、发送SQL语句和处理数据库执行结果。 🌟二、JDBC编程的步骤 ✨使用步骤 1.加载数据库厂商的驱动包 2.建立连接,用户名,密码 3.创建Statement 4.发送要执行的SQL语句

By Ne0inhk