Spring Boot 3.5.3 集成 Log4j2 日志系統

在 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;在高階數據結構中我們要學習的重點是圖等 目錄 一、并查集的原理 二、并查集的基本操作…