在 Spring Boot 3.5.3 中,要将默认的 Logback 替换为 Log4j2,需要以下步骤:

1. 添加 Log4j2 依赖

在 pom.xml中排除默认的 Logback 依赖并添加 Log4j2 依赖:

<dependencies><!-- 排除默认的 Logback --><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><!-- 添加 Log4j2 Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency><!-- 可选:日志配置刷新支持 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-liquibase</artifactId></dependency>
</dependencies>

2. 创建 Log4j2 配置文件

在 src/main/resources目录下创建 log4j2.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30"><Appenders><!-- 控制台输出 --><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console><!-- 文件输出 --><RollingFile name="File" fileName="logs/application.log"filePattern="logs/application-%d{yyyy-MM-dd}-%i.log"><PatternLayout><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern></PatternLayout><Policies><!-- 每天滚动 --><TimeBasedTriggeringPolicy /><!-- 文件大小达到100MB时滚动 --><SizeBasedTriggeringPolicy size="100 MB"/></Policies><!-- 保留最近7天的日志 --><DefaultRolloverStrategy max="7"/></RollingFile><!-- 异步日志配置 --><Async name="Async" bufferSize="262144"><AppenderRef ref="File"/></Async></Appenders><Loggers><!-- Spring Boot 核心日志 --><Logger name="org.springframework" level="INFO"/><Logger name="org.apache" level="WARN"/><!-- Hibernate 日志 --><Logger name="org.hibernate.SQL" level="DEBUG" additivity="false"><AppenderRef ref="Console"/></Logger><Logger name="org.hibernate.type.descriptor.sql" level="TRACE" additivity="false"><AppenderRef ref="Console"/></Logger><!-- 自定义包日志级别 --><Logger name="com.myapp" level="DEBUG"/><!-- Root 日志设置 --><Root level="INFO"><AppenderRef ref="Console"/><AppenderRef ref="Async"/> <!-- 使用异步文件输出 --></Root></Loggers>
</Configuration>

3. 添加 application.yml 配置

在 application.yml中添加 Log4j2 相关配置:

spring:application:name: my-applicationlogging:config: classpath:log4j2.xmllevel:root: infoorg.springframework.web: debugcom.myapp.service: trace# 启用日志配置热更新log4j2:watch: trueshutdown-hook: disableshutdown-timeout: 30

4. 添加日志工具类

创建日志工具类以简化使用:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;public class LogUtil {private LogUtil() {}public static Logger getLogger() {// 获取调用此方法的上层类名return LogManager.getLogger(Thread.currentThread().getStackTrace()[2].getClassName());}// 方法入参日志(使用MDC添加上下文信息)public static void logMethodEntry(Object... params) {Logger logger = getLogger();if(logger.isTraceEnabled()) {String methodName = Thread.currentThread().getStackTrace()[2].getMethodName();logger.trace("Entering: {} with params: {}", methodName, params);}}
}

5. 高级功能配置

5.1 日志脱敏配置

添加敏感信息脱敏配置类:

import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.pattern.ConverterKeys;
import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;@Plugin(name = "SafeConverter", category = "Converter")
@ConverterKeys({"safe"})
public class SafeConverter extends LogEventPatternConverter {// 敏感信息正则匹配private static final String SENSITIVE_PATTERN = "\\b(?:password|passwd|pwd|secret|token|key|card|ccn|phone|tel|id)\\b[^=]*=\\s*['\"]?([^'\",\\s]+)";protected SafeConverter() {super("safe", "safe");}public static SafeConverter newInstance(String[] options) {return new SafeConverter();}@Overridepublic void format(LogEvent event, StringBuilder toAppendTo) {String message = event.getMessage().getFormattedMessage();toAppendTo.append(message.replaceAll(SENSITIVE_PATTERN, "$1=***"));}
}

在 log4j2.xml中使用:

<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %safe{%msg}%n"/>

5.2 日志指标监控

添加 Log4j2 指标采集:

import io.micrometer.core.instrument.MeterRegistry;
import org.apache.logging.log4j.LogManager;
import org.springframework.context.annotation.Configuration;import javax.annotation.PostConstruct;@Configuration
public class LogMetricsConfig {private final MeterRegistry meterRegistry;public LogMetricsConfig(MeterRegistry meterRegistry) {this.meterRegistry = meterRegistry;}@PostConstructpublic void init() {// 采集ERROR级别的日志计数meterRegistry.gauge("log.error.count", LogManager.getRootLogger(), logger -> logger instanceof org.apache.logging.log4j.core.Logger ? ((org.apache.logging.log4j.core.Logger) logger).getCount().get() : 0);}
}

5.3 日志集中式管理

添加 Logstash 或 ELK 支持:

<!-- pom.xml 添加依赖 -->
<dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>7.3</version>
</dependency>

配置 Logstash Appender:

<Appenders><!-- Logstash TCP 输出 --><LogstashTcpSocket name="Logstash" host="logstash.mycompany.com" port="5000"><JsonLayout compact="true" eventEol="true"><KeyValuePair key="appName" value="${spring:spring.application.name}"/><KeyValuePair key="environment" value="${spring:spring.profiles.active}"/></JsonLayout></LogstashTcpSocket>
</Appenders><Loggers><Root level="INFO"><AppenderRef ref="Logstash"/></Root>
</Loggers>

6. Spring Boot 配置类

添加日志相关的配置管理:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.LoggerContext;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.EventListener;import java.net.URI;@Configuration
public class LogConfig {/*** 应用启动后重新加载日志配置*/@EventListener(ApplicationStartedEvent.class)public void reloadLogConfig() {LoggerContext context = (LoggerContext) LogManager.getContext(false);context.setConfigLocation(URI.create("classpath:log4j2.xml"));context.reconfigure();}
}

7. 日志性能优化

7.1 异步日志配置优化

<!-- log4j2.xml -->
<AsyncLogger name="com.myapp" level="debug" additivity="false"><AppenderRef ref="Console"/><AppenderRef ref="File"/><!-- 队列大小 --><AsyncQueueSize>262144</AsyncQueueSize><!-- 等待策略 --><AsyncWaitStrategy type="Block"/>
</AsyncLogger>

7.2 日志开关控制器

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configurator;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class LogController {@GetMapping("/log/level")public String changeLogLevel(String logger, String level) {LoggerContext context = (LoggerContext) LogManager.getContext(false);// 设置特定日志级别if ("root".equalsIgnoreCase(logger)) {Configurator.setRootLevel(Level.valueOf(level));} else {Configurator.setLevel(logger, Level.valueOf(level));}context.reconfigure();return "Log level updated: " + logger + " -> " + level;}
}

8. 验证日志配置

创建测试控制器验证日志输出:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class LogTestController {private static final Logger logger = LogManager.getLogger(LogTestController.class);@GetMapping("/test/log")public String testLog() {logger.trace("This is a TRACE message");logger.debug("This is a DEBUG message");logger.info("This is an INFO message");logger.warn("This is a WARN message");logger.error("This is an ERROR message");return "Log messages generated!";}
}

访问 http://localhost:8080/test/log后,检查控制台和日志文件验证输出。

配置总结

功能

配置位置

说明

基础配置

log4j2.xml

定义日志格式、输出目的地等

级别控制

application.yml

设置不同包的日志级别

热更新

logging.log4j2.watch

配置自动检测配置变化

异步日志

Async Appender

提高日志性能

日志脱敏

SafeConverter

保护敏感信息

日志监控

Micrometer

采集日志指标

远程日志

LogstashTcpSocket

集成ELK栈

此配置提供了:

  1. 灵活的日志级别控制

  2. 高性能的异步日志处理

  3. 敏感信息保护

  4. 监控和管理功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95450.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95450.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/95450.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ADB图片上传轮播

可以通过ADB在机器中进行上传照片&#xff0c;进行其他图片播放 当前系统架构分析 1. 现有组件结构 ImageCarouselActivity: 主要的轮播Activity&#xff0c;继承自BaseBindingActivity 实现全屏显示和沉浸式体验使用ViewPager2进行图片轮播支持自动轮播&#xff08;5秒间隔&…

异常处理小妙招——2.代码的韧性:如何实现操作的原子性回滚

一、核心思想&#xff1a;什么叫“失败原子性”&#xff1f; 想象一下你在玩一个闯关游戏&#xff0c;有一关需要你连续跳过三个平台。 不具有原子性&#xff1a;你跳过了第一个和第二个平台&#xff0c;但在跳第三个时失败了、掉下去了。结果你不仅没过关&#xff0c;连之前跳…

Crawl4AI:为LLM而生的下一代网页爬虫框架

在当今AI驱动的信息处理时代&#xff0c;从网页中高效提取高质量、结构化的数据已成为连接互联网与大语言模型&#xff08;LLM&#xff09;的关键桥梁。Crawl4AI作为一款开源的LLM友好型网页爬虫与刮板工具&#xff0c;正迅速成为开发者处理这一任务的首选解决方案。本文将深入…

输出一个爱心

输出效果&#xff1a;代码实现&#xff1a;#include<iostream> #include<iomanip> #include<algorithm> using namespace std; int main() {int n;cin>>n;char a[8] {I,L,O,V,E,Y,O,U};int j 1;int k n*21;int o n*2-2;int aa 0; for(int i 0;i&…

深度集成Dify API:企业级RAG知识库管理平台解决方案

&#x1f3af; 需求和概述 当前基于Dify实现企业级的智能问答系统需求日益增长&#xff0c;Dify的低代码开发框架和功能完整、灵活适应各种需求的特色得到广大大模型和RAG开发着的欢迎。但是Dify在落地企业级应用时候&#xff0c;也面临不少的问题&#xff0c;最突出的就是Dif…

C++循环越界问题

for (int i 0; i < historyTableList.size() - 1; i) {historyList2.push_back(historyTableList[i]); } historyList.size()0时&#xff0c;为什么会异常historyTableList.size() 返回的是 size_t 类型&#xff08;无符号整数&#xff09;当 size() 0 时&#xff0c;size…

MongoDB 从零到入门:实用指南

什么是 MongoDB&#xff1f; MongoDB 是一个流行的非关系型数据库&#xff08;NoSQL&#xff09;&#xff0c;它使用类似 JSON 的文档来存储数据&#xff0c;而不是传统的表格形式。这使得 MongoDB 非常灵活&#xff0c;特别适合处理半结构化数据和快速迭代的开发场景。 核心概…

WebRTC音频QoS方法五(音频变速算法之Expand算法实现)

一、概述介绍在WebRTC中&#xff0c;存在两种扩展算法&#xff1a;PreemptiveExpand和Expand。尽管这两种算法的目标都是扩展音频信号&#xff0c;但它们的实现原理和应用场景却有所不同。PreemptiveExpand&#xff08;预防性扩张&#xff09;主动扩展策略&#xff0c;旨在防止…

【Python - 基础 - 工具】解决pycharm“No Python interpreter configured for the project”问题

解决pycharm“No Python interpreter configured for the project”问题 当你在 PyCharm 中遇到“No Python interpreter configured for the project”错误时&#xff0c;意味着你的项目没有配置 Python 解释器。以下是解决该问题的步骤。 示例 # 尝试运行代码时出现错误 prin…

Elasticsearch创建索引分片和副本大小建议

在Elasticsearch中&#xff0c;‌分片(shard)和副本(replica)‌ 的设置直接影响集群性能、容错能力和扩展性。以下是最佳实践指南&#xff1a;核心概念‌类型‌‌描述‌‌是否可修改‌‌主分片(Primary Shard)‌数据的最小存储单元&#xff0c;每个索引被拆分成多个主分片❌ 索…

“人工智能+虚拟仿真”开启新学期智慧学习之旅

在教育领域掀起数字化革新浪潮的今天&#xff0c;新学期的开启不仅意味着知识探索新征程的起步&#xff0c;更蕴含着教育模式深度变革的无限可能。虚拟仿真技术作为教育现代化的关键驱动力&#xff0c;正重塑学习体验&#xff0c;引领教育范式转移。人工智能与虚拟仿真技术的结…

Photoshop用户必看:让你的PSD像JPG一样可预览

软件介绍 Photoshop缩略图补丁插件3.8.0.96是一款实用的工具&#xff0c;它能够将PSD格式的文件&#xff08;Photoshop的专用格式&#xff09;以缩略图的形式显示出来。这一功能极大地提升了用户在管理和查找图像文件时的效率&#xff0c;使得看图、找图变得更加轻松便捷。该插…

idea2025.1.5安装+pj

写在前边&#xff1a;如果是卸载旧版本IDEA重装&#xff0c;一定记得之前的插件啥的&#xff0c;截个图。还有主题字体设置啥的 目录背景原因卸载原来版本安装教程背景原因 原来的2022.2不支持jdk21的语言版本 卸载原来版本 1、如何彻底卸载 IDE, 可参考这篇的文章&#xff…

(四)Python控制结构(条件结构)

程序中的语句默认会按照自上而下的顺序逐条执行&#xff0c;但通过一些特定的语句可以更改语句的执行顺序&#xff0c;使之产生跳跃、回溯等现象&#xff0c;进而灵活地控制程序的执行流程。控制结构是编程中用于控制程序执行流程的语句&#xff0c;程序的三种基本控制结构为&a…

血缘元数据采集开放标准:OpenLineage Guides 使用 Apache Airflow® 和 OpenLineage + Marquez 入门

OpenLineage 是一个用于元数据和血缘采集的开放标准&#xff0c;专为在作业运行时动态采集数据而设计。它通过统一的命名策略定义了由作业&#xff08;Job&#xff09;、运行实例&#xff08;Run&#xff09;和数据集&#xff08;Dataset&#xff09; 组成的通用模型&#xff0…

FPGA|Quartus II 中使用TCL文件进行引脚一键分配

在FPGA设计过程中&#xff0c;合理的引脚分配是确保硬件功能正确实现的关键步骤之一。Quartus II 提供了通过 TCL&#xff08;Tool Command Language&#xff09;脚本自动化引脚分配的功能&#xff0c;这不仅可以大大提高设计效率&#xff0c;还能够确保引脚分配的精确性和可重…

【Docker/Redis】服务端高并发分布式结构演进之路

目录 概述 常见概念 基本概念 应用&#xff08;Application&#xff09;/ 系统&#xff08;System&#xff09; 模块&#xff08;Module&#xff09;/ 组件&#xff08;Component&#xff09; 分布式&#xff08;Distributed&#xff09; 集群&#xff08;Cluster&#x…

【Excel】将一个单元格内​​的多行文本,​​拆分成多个单元格,每个单元格一行​​

​​所有文本都堆积在“prefix”列顶部的同一个单元格里&#xff08;很可能是B10单元格&#xff09;&#xff0c;并且它们是用空格分隔的&#xff0c;而不是换行符。​​因此&#xff0c;您不需要处理换行符&#xff0c;而是需要​​按“空格”进行分列&#xff0c;并且将分列后…

新手SEO操作第一步

内容概要 网站优化对于新手而言&#xff0c;常常感觉无从下手。别担心&#xff0c;这篇文章就是为你量身打造的入门指南。我们将从最基础也是最重要的关键词研究开始讲起&#xff0c;手把手教你如何精准找到目标用户搜索的词。掌握了关键词&#xff0c;接下来就是如何创作出搜索…

【高阶数据结构】秘法(一)——并查集:探索如何高效地管理集合

前言&#xff1a; 前面我们已经学习了简单的数据结构&#xff0c;包括栈与队列、二叉树、红黑树等等&#xff0c;今天我们继续数据结构的学习&#xff0c;但是难度上会逐渐增大&#xff0c;在高阶数据结构中我们要学习的重点是图等 目录 一、并查集的原理 二、并查集的基本操作…