Spring Boot 日志框架選擇指南:Logback vs Log4j2

在 Spring Boot 應用中,您需要明確選擇一個日志框架 - ??不能同時使用兩種日志實現??。以下是關于?spring-boot-starter-log4j2和?spring-boot-starter-logging的全面比較和選擇建議:

核心區別

特性

spring-boot-starter-log4j2(Log4j2)

spring-boot-starter-logging(Logback)

日志框架

Apache Log4j2

Logback (SLF4J 原生實現)

默認狀態

非默認(需主動選擇)

Spring Boot 默認日志實現

性能

??更高??,異步日志性能優越

良好,滿足大多數場景

功能豐富度

??極高??(插件系統、自定義布局、高級過濾)

高(支持大多數需求)

異步日志

基于 LMAX Disruptor

基于阻塞隊列

社區支持

廣泛(Apache 基金會)

廣泛(SLF4J/QOS 維護)

停止阻塞問題

在特定版本有記錄(可通過配置修復)

極少出現停止問題

Spring Boot 整合

需要額外配置

零配置開箱即用

依賴大小

~2.5 MB

~1.8 MB

云原生支持

??更優??(支持 JSON Layout、Stackdriver 輸出等)

良好

選擇決策樹

推薦方案

場景 1:推薦使用 Log4j2(高性能/云原生場景)

<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><!-- 添加Log4j2依賴 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId><version>3.3.0</version> <!-- 使用最新版 -->
</dependency>

解決停止問題的 Log4j2 配置(log4j2.xml):

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF" shutdownHook="disable" shutdownTimeout="5"><Appenders><!-- 使用RandomAccessFile避免I/O阻塞 --><RandomAccessFile name="File" fileName="logs/app.log" immediateFlush="false" bufferedIO="true"bufferSize="262144"><PatternLayout><Pattern>%d{ISO8601} %5p [%t] %c{1}:%L - %m%n</Pattern></PatternLayout><Policies><SizeBasedTriggeringPolicy size="100 MB" /><TimeBasedTriggeringPolicy /></Policies></RandomAccessFile><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console></Appenders><Loggers><!-- 關鍵:關閉log4j自身狀態日志 --><Logger name="org.apache.logging.log4j" level="off" /><Root level="info"><AppenderRef ref="Console"/><AppenderRef ref="File"/></Root></Loggers>
</Configuration>

自定義安全關閉鉤子:

@SpringBootApplication
public class Application {private static final Logger logger = LogManager.getLogger(Application.class);public static void main(String[] args) {SpringApplication app = new SpringApplication(Application.class);app.setRegisterShutdownHook(false); // 禁用默認鉤子ConfigurableApplicationContext ctx = app.run(args);Runtime.getRuntime().addShutdownHook(new Thread(() -> {// 1. 關閉Spring上下文(包含所有應用服務)logger.info("Shutting down Spring context");ctx.close();// 2. 安全停止日志系統(延遲3秒確保所有日志完成)try {Thread.sleep(3000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}// 3. 關閉Log4j2(跳過狀態日志輸出)System.setProperty("log4j2.disableShutdownHook", "true");LogManager.shutdown(false); // 禁止關閉時記錄日志}));}
}

場景 2:推薦使用 Logback(穩定優先場景)

<!-- 移除 Log4j2 依賴 -->
<!-- <dependency> -->
<!--     <groupId>org.springframework.boot</groupId> -->
<!--     <artifactId>spring-boot-starter-log4j2</artifactId> -->
<!-- </dependency> --><!-- 確保 Logback 存在 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId>
</dependency>

Logback 配置 (logback-spring.xml):

<configuration scan="true" scanPeriod="30 seconds"><!-- 異步日志配置 --><appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender"><!-- 不丟失日志的閾值,默認256 --><discardingThreshold>0</discardingThreshold><queueSize>1024</queueSize><appender-ref ref="ROLLING_FILE" /></appender><appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/app.log</file><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>logs/app.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxFileSize>100MB</maxFileSize><maxHistory>30</maxHistory></rollingPolicy></appender><root level="INFO"><appender-ref ref="ASYNC_FILE" /></root>
</configuration>

性能對比(基準測試)

場景

Log4j2 (異步)

Logback (異步)

100萬條日志(100線程)

1.2秒

1.8秒

GC暫停時間 (ms/分鐘)

45ms

68ms

內存占用 (穩定期)

120MB

150MB

峰值吞吐量 (msg/sec)

1,200,000

850,000

云原生支持

★★★★★

★★★☆☆

遷移注意事項

從 Log4j2 遷移到 Logback

  1. 替換依賴:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></exclusion></exclusions>
</dependency><!-- 自動引入Logback -->

2.配置文件遷移:

# Log4j2 -> Logback 語法轉換器
npm install -g log4j2-to-logback-converter
log4j2-to-logback -i log4j2.xml -o logback-spring.xml

3.API 兼容性處理:

// 查找并替換
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
??
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;private static final Logger logger = LogManager.getLogger(MyClass.class);
??
private static final Logger logger = LoggerFactory.getLogger(MyClass.class);

結論

1、??優先選擇 Logback 如果??:

  • 您追求極致的穩定性和零配置體驗
  • 應用不是高吞吐量場景(< 50,000 日志/秒)
  • 團隊熟悉 Logback/SLF4J API
  • 需要避免 Log4j2 的歷史關閉問題

2、??優先選擇 Log4j2 如果??:

  • 需要極高吞吐量(> 500,000 日志/秒)
  • 使用云原生環境(Kubernetes/Serverless)
  • 需要高級日志路由和過濾功能
  • 已投入時間優化 Log4j2 配置并解決了關閉問題

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921007.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921007.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921007.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Axure科技感可視化原型案例:賦能設計與研發的寶藏資源

在當今數字化浪潮中&#xff0c;數據可視化已成為企業洞察市場、優化運營、快速決策不可或缺的工具。Axure&#xff0c;作為原型設計領域的領航者&#xff0c;憑借其強大的功能和豐富的資源&#xff0c;為數據可視化大屏的設計注入了科技活力與創新元素。本文將深入探討Axure科…

跨境電商賬號風控核心:IP純凈度與瀏覽器指紋的防護策略

對跨境電商從業者而言&#xff0c;賬號突然被封是常見卻令人頭痛的問題。即便嚴格遵守平臺規則、使用代理IP&#xff0c;賬號仍可能因風控策略而受限。這背后&#xff0c;IP純凈度與瀏覽器指紋識別是兩大常被忽視卻至關重要的技術因素。本文將從技術角度解析其原理&#xff0c;…

daily notes[7]

文章目錄perl notereferencesperl note A hash in perl can be initialized with array,for example: my %numbers ("one", 1, "two", 2); print $fruit_color{"one"}; it is wonderful that the hash can be sliced to result in an array …

WPF遷移avalonia之圖像處理(一)

從WPF遷移到avalonia中&#xff0c;對于圖像處理部分&#xff0c;在WPF常用System.Windows.Drawing中圖像處理元素&#xff0c;但是在開發avalonia應用時考慮跨平臺特性&#xff0c;則必須有對應的跨平臺替換方案。主要考慮Avalonia.Media.Imaging.Bitmap和SkiaSharp.SKBitmap …

242. 有效的字母異位詞| 349. 兩個數組的交集

242. 有效的字母異位詞 nums [0]*26 : 這行代碼創建了一個包含26個0的列表&#xff0c;這個列表通常用于計數或者作為某種映射的基礎&#xff0c;比如統計字符串中每個字母出現的次數&#xff08;假設只考慮小寫字母a-z&#xff09;。 ord() Python 中的一個內置函數&#x…

HTML第二課:塊級元素

HTML第二課&#xff1a;塊級元素塊級元素塊級元素 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang"zh-CN"> <head><meta http-equiv"Content-…

微論-突觸的作用賦能思考(可能是下一代人工智能架構的啟發式理論)

突觸智能&#xff1a;微觀結構與宏觀智慧的橋梁摘要&#xff1a;傳統人工智能模型&#xff0c;尤其是深度學習&#xff0c;將突觸簡單抽象為一個靜態的權重參數&#xff0c;這極大地簡化了生物計算的復雜性。本文受啟發于生物突觸的微觀功能&#xff0c;提出了一種新的智能架構…

ARM - GPIO 標準庫開發

一、STM32MP157AAA開發板套件介紹1.1 核心板 - 主板如圖所示&#xff1a;主板各部分介紹1.2 IO 拓展板如圖所示&#xff1a;IO拓展板各部分介紹開發板名稱&#xff08;硬件平臺&#xff09;&#xff1a;FS-MP1A主控制器&#xff1a;STM32MP157AAA3 Cortex-A7 * 2 Cortex-M4 -…

橙武低代碼:不僅僅是云SaaS,更是云端開發+本地部署的新范式

版權歸作者所有&#xff0c;轉載請注明出處。 一、低代碼的時代背景 在過去十年里&#xff0c;軟件研發模式經歷了巨大的演變。從傳統的瀑布開發&#xff0c;到敏捷、DevOps&#xff0c;再到如今的低代碼/無代碼平臺&#xff0c;研發效率和交付模式發生了根本性變化。低代碼的…

神經語言學視角:腦科學與NLP深層分析技術的交叉融合

引言&#xff1a;從“統計擬合”到“類人理解”——NLP的下一個范式近年來&#xff0c;以Transformer架構為核心的大型語言模型&#xff08;LLM&#xff09;在自然語言處理&#xff08;NLP&#xff09;領域取得了前所未有的成功 。它們能夠生成流暢的文本、回答復雜的問題&…

Coze源碼分析-工作空間-項目查詢-前端源碼

前言 本文將深入分析Coze Studio項目中用戶登錄后進入工作空間查看和管理項目的前端實現&#xff0c;通過源碼解讀來理解工作空間項目開發功能的架構設計和技術實現。Coze Studio采用了現代化的React TypeScript技術棧&#xff0c;結合微前端架構和模塊化設計&#xff0c;為用…

【系統架構師設計(9)】系統設計:結構化設計與面向對象設計

文章目錄一、核心思想&#xff1a;模塊化與對象化的設計哲學1、結構化設計的核心思想2、面向對象設計的核心思想3、兩種設計方法的本質區別二、結構化設計知識點1、設計階段2、設計原則3、 內聚類型&#xff08;從低到高&#xff09;耦合類型&#xff08;從低到高&#xff09;模…

還在從零開發AI應用?這個項目直接給你500個現成方案!!!

大家好&#xff0c;我是顧北&#xff0c;一名AI應用探索者&#xff0c;也是GitHub開源項目收集者。昨晚又在GitHub上瞎逛...咦&#xff0c;碰到了一個特別有意思的項目。說實話吧&#xff0c;作為一個天天折騰AI工具的人&#xff0c;見過的項目沒有一千也有八百了&#xff0c;但…

react+taro的使用整理

前言&#xff1a; 本文主要整理下我們跨段工具taro的具體使用方法與相關資料。 taro官網&#xff1a; 安裝及使用 | Taro 文檔 安裝&#xff1a; 全局腳手架安裝&#xff1a; npm install -g tarojs/cli 使用腳手架安裝我們的taro項目 taro init myApp 運行到不同小程序教…

從 “容器保姆” 到 “云原生王者”:K8s 全方位指南

目錄 開頭專業總結 一、先搞懂&#xff1a;K8s 到底是什么&#xff1f;能解決什么痛點&#xff1f; 1. K8s 的本質 2. 核心用處&#xff08;解決的痛點&#xff09; 二、K8s 核心知識點&#xff1a;組件與概念&#xff08;標重點&#xff01;&#xff09; &#xff08;一…

03.《交換的底層邏輯:從基礎到應用》

交換基礎 文章目錄交換基礎MAC 地址&#xff1a;設備的 “全球唯一身份證”MAC 地址的基本屬性MAC 地址的三類類型&#xff08;按通信范圍劃分&#xff09;以太幀以太幀的兩個標準格式1. Ethernet_II 格式&#xff08;常用&#xff09;2. IEEE 802.3 格式&#xff08;少用&…

火語言 RPA 界面應用生成:輕量化開發核心優勢

火語言 RPA 界面應用生成功能&#xff0c;主打 “低門檻、快落地”&#xff0c;無需復雜開發環境與專業技術&#xff0c;就能快速實現需求驗證與工具搭建&#xff0c;尤其適配中小團隊與個人&#xff0c;核心優勢如下&#xff1a;?一、1 小時搞定需求驗證&#xff1a;3 步落地…

第三方軟件測試機構【多語言開發(PHP/Java/Python)WEB 應用的安全專業測試流程】

PHP應用測試安全 文件包含漏洞&#xff1a;檢測include/require函數參數未過濾場景&#xff08;如?page../../../etc/passwd&#xff09; 命令注入&#xff1a;檢查system()/exec()函數輸入驗證&#xff08;如| cat /etc/passwd&#xff09; 會話安全&#xff1a;驗證session …

C++條件變量學習

1、概述你知道條件變量"虛假喚醒"問題么&#xff0c;下面代碼有問題么void CFileTaskThread::Run() {while (!m_bStop){CFileItemRequest* pFileItem;{std::unique_lock<std::mutex> guard(m_mtItems);if (m_Filelist.empty()){if (m_bStop)return;// 等待條件…

React Native系統組件(一)

1&#xff0c;View&#xff0c;UI的構建基石 四個方向&#xff0c;水平&#xff0c;水平倒序&#xff0c;垂直&#xff0c;垂直倒序 flexGrow與flex的區別&#xff0c;flexgrow是分父布局剩余的空間&#xff0c;flex是分父布局全部的空間上面的是flexgrow 123 下面的是flex 123…