log4j2的日志框架(詳細,springboot和異步日志的實現)

目錄

log4j2的介紹

Log4j2的性能

SpringBoot中的使用Log4j2

log4j2的進階--異步日志

?AsyncAppender方式

AsyncLogger方式?


log4j2的介紹

Apache Log4j 2是對Log4j的升級版,參考了logback的一些優秀的設計,并且修復了一些問題,因此帶 來了一些重大的提升,主要有:

  • 異常處理,在 logback中,Appender中的異常不會被應用感知到,但是在log4j2中,提供了一些異 常處理機制。
  • 性能提升, log4j2相較于log4j 和logback都具有很明顯的性能提升,后面會有官方測試的數據。
  • 自動重載配置,參考了 logback的設計,當然會提供自動刷新參數配置,最實用的就是我們在生產 上可以動態的修改日志的級別而不需要重啟應用。
  • 無垃圾機制, log4j2在大部分情況下,都可以使用其設計的一套無垃圾機制,避免頻繁的日志收集 導致的jvm gc

官網地址:? ??https://logging.apache.org/log4j/2.x/

Log4j2的性能

Log4j2最牛的地方在于異步輸出日志時的性能表現,Log4j2在多線程的環境下吞吐量與Log4j和 Logback的比較如下圖。下圖比較中Log4j2有三種模式:1)全局使用異步模式;2)部分Logger采用異步模式;3)異步Appender。可以看出在前兩種模式下,Log4j2的性能較之Log4j和Logback有很大的 優勢。

無垃圾記錄

垃圾收集暫停是延遲峰值的常見原因,并且對于許多系統而言,花費大量精力來控制這些暫停。

許多日志庫(包括以前版本的Log4j)在穩態日志記錄期間分配臨時對象,如日志事件對象,字符串, 字符數組,字節數組等。這會對垃圾收集器造成壓力并增加GC暫停發生的頻率。

從版本2.6開始,默認情況下Log4j以“無垃圾”模式運行,其中重用對象和緩沖區,并且盡可能不分配臨 時對象。還有一個“低垃圾”模式,它不是完全無垃圾,但不使用ThreadLocal字段。

Log4j 2.6中的無垃圾日志記錄部分通過重用ThreadLocal字段中的對象來實現,部分通過在將文本轉換 為字節時重用緩沖區來實現。?

從圖中可以看出log4j2的性能是完全吊打其他日志框架的,而且log4j2的異步日志功能非常的強大,可以大大的減少日志系統對業務系統的負擔。基于這些功能,所以現在主流的日志開發架構就是SLF4J+Log4j2這個組合,所以這個log4j2這個日志框架是必須要學會的

SpringBoot中的使用Log4j2

springboot框架在企業中的使用越來越普遍,springboot日志也是開發中常用的日志系統。springboot 默認就是使用SLF4J作為日志門面,logback作為日志實現來記錄日志。所以如果我們要在springboot項目中使用Log4j2,需要內置的日志框架給去除。

分成三步,第一移除默認的日志框架,第二加入log4j2的依賴(啟動器),第三編寫配置文件

  • 移除默認的日志框架
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!--排除默認spring-boot-starter-logging啟動器--><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>
</dependency>

編寫log4j2.xml配置文件‘

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"><!-- 定義全局變量,日志文件路徑和格式 --><Properties><Property name="log.path">./dev</Property><Property name="log.name">forlan-log4j2</Property><Property name="file.pattern">%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{50} - %msg%n</Property></Properties><!-- 控制臺輸出配置 --><Appenders><Console name="STDOUT" target="SYSTEM_OUT"><PatternLayout pattern="${file.pattern}"/><ThresholdFilter level="DEBUG"/></Console><!-- 文件輸出配置 --><RollingFile name="INFO_FILE" fileName="${log.path}/${log.name}.info.log"filePattern="${log.path}/%d{yyyy-MM-dd}/${log.name}.info.%d{yyyy-MM-dd}-%i.log"><PatternLayout pattern="${file.pattern}"/><LevelMatchFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/><!-- 每個文件最大10MB --><SizeBasedTriggeringPolicy size="10MB"/><!-- 最多保留30天的歷史記錄 --><DefaultRolloverStrategy max="30"/></RollingFile><!-- 文件輸出配置 --><RollingFile name="ERROR_FILE" fileName="${log.path}/${log.name}.error.log"filePattern="${log.path}/%d{yyyy-MM-dd}/${log.name}.error.%d{yyyy-MM-dd}-%i.log"><PatternLayout pattern="${file.pattern}"/><LevelMatchFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/><!-- 每個文件最大10MB --><SizeBasedTriggeringPolicy size="10MB"/><!-- 最多保留30天的歷史記錄 --><DefaultRolloverStrategy max="30"/></RollingFile></Appenders><!-- 設置root logger --><Loggers><Root level="INFO"><AppenderRef ref="STDOUT"/><AppenderRef ref="INFO_FILE"/><AppenderRef ref="ERROR_FILE"/></Root></Loggers>
</Configuration>
  • ?運行測試
@SpringBootTest
public class Slf4jTest {// 聲明日志對象public final static Logger LOGGER = LoggerFactory.getLogger(Slf4jTest.class);@Testpublic void testQuick() throws Exception {//打印日志信息LOGGER.error("error");LOGGER.warn("warn");LOGGER.info("info");LOGGER.debug("debug");LOGGER.trace("trace");// 使用占位符輸出日志信息String name = "jack";Integer age = 18;LOGGER.info("用戶:{},{}", name, age);// 將系統異常信息寫入日志try {int i = 1 / 0;} catch (Exception e) {// e.printStackTrace();LOGGER.info("出現異常:", e);}}
}

?

出現入上圖的結果就代表log4j2就配置成功了,主要注意那個dev的日志文件是否生成,這個日志文件是在前面的配置文件中配置的。

到這里log4j2的基本使用其實已經可以實現了,對于一些小的項目,這樣子配置就可以了,但對于那些大型項目,log4j2還可以更加強大,那就是使用它的異步日志功能?

log4j2的進階--異步日志

logl4j2最大的特點就是異步日志,其性能的提升主要也是從異步日志中受益,我們來看看如何使用 log4j2的異步日志。

Log4j2 提供了兩種實現日志的方式,一個是通過AsyncAppender,一個是通過AsyncLogger,分別對應 前面我們說的Appender組件和Logger組件。?

log4j2的全局異步AsyncLogger性能最好,第二個是混合異步AsyncLogger,性能最差的是AsyncAppender(和同步日志相比沒有什么性能提升。和logback性能一樣)

如果使用異步日志,全局異步AsyncLogger、混合異步AsyncLogger、AsyncAppender,不要同時使用。否則會使用性能較低的一種異步方式
?

注意:配置異步日志需要添加依賴

<!--異步日志依賴-->
?<dependency>
?????????<groupId>com.lmax</groupId>
?????????<artifactId>disruptor</artifactId>
?????????<version>3.3.4</version>
?</dependency>

?AsyncAppender方式

?AsyncAppender:這種使用方式較為簡單,只需要在我們上述的Appender中加入以下標簽即可:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" monitorInterval="5"><properties><property name="LOG_HOME">C:/Users/dell/Desktop/java11Test/logs</property></properties><Appenders><File name="File" fileName="${LOG_HOME}/myFile.log"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] %l --- %msg%n" /></File><!-- AsyncAppender引用appender --><Async name="Async"><AppenderRef ref="File"/></Async></Appenders><Loggers><Root level="INFO"><!-- 直接引用AsyncAppender --><AppenderRef ref="Async" /></Root></Loggers></Configuration>
AsyncLogger方式?

AsyncLogger才是log4j2 的重頭戲,也是官方推薦的異步方式。它可以使得調用Logger.log返回的 更快。你可以有兩種選擇:全局異步和混合異步。

全局異步 就是,所有的日志都異步的記錄,在配置文件上不用做任何改動,只需要添加一個 log4j2.component.properties 配置;

Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

混合異步 就是,你可以在應用中同時使用同步日志和異步日志,這使得日志的配置方式更加 靈活。?

    <!--logger定義--><Loggers><!--自定義異步logger對象includeLocation = "false" 關閉日志記錄行好信息additivity = "false" 不再繼承rootlogger對象--><AsyncLogger name = "com.itcats" level = "trace" includeLocation = "false" additivity = "false"><AppenderRef ref="Console"/></AsyncLogger><Root level = "trace"><AppenderRef ref  ="Console"/></Root></Loggers>

將以上配置配置到我們之前的log4j2.xml配置文件中,將之前的logger定義替換。此時我們com.itcats日志是異步的,root日志是同步的。

使用異步日志需要注意的問題:

1. 如果使用異步日志,AsyncAppender、AsyncLogger和全局日志,不要同時出現。性能會和 AsyncAppender一致,降至最低。

2. 設置includeLocation=false ,打印位置信息會急劇降低異步日志的性能,比同步日志還要慢

到這里我們的java日志框架基本就介紹完了

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

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

相關文章

Go-知識測試-測試參數

Go-知識測試-測試參數 1. -args2. -json3. -o4. -bench5. -benchtime6. -cpu7. -count8. -failfast9. -list10. -parallel11. -run12. -timeout13. -v14 -benchmem 1. -args 指示go test 把-args 后面的參數帶到測試中去。具體的測試函數會根據此參數來控制測試流程。 -args后…

主機安全-進程、命令攻擊與檢測

目錄 概述反彈shell原理nc/dev/xxx反彈shell下載不落地反彈Shell各種語言反彈shell linux提權sudosuid提權mysql提權 Dnslog參考 概述 本文更新通過在主機&#xff08;不含容器&#xff09;上直接執行命令或啟動進程來攻擊的場景。檢測方面以字節跳動的開源HIDS elkeid舉例。每…

磁感應強度檢測模塊使用教程

目錄 一、磁感應強度檢測模塊(AT 協議版本、Modbus 協議版本)1、參數2、報警引腳 二、AT版本1、接線說明2、AT 指令 三、Modbus 版本1、接線說明2、Modbus 指令格式3、Modbus 指令 一、磁感應強度檢測模塊(AT 協議版本、Modbus 協議版本) 圖1 正面 圖2 背面 AT 協議版本和 Modb…

Letter Exchange

這道題目看官方題解就好了&#xff0c;這個轉換圖論挺顯然的 證明一下為什么最后一定是 顯然練完貶值后圖只能長成這個樣子 在消掉長度為\(2\)的環后&#xff0c;如果說圖沒邊了&#xff0c; 那么顯然就不用交換了&#xff0c;否則的話我們任取一條邊 那么對于\(2\)號點來說&am…

韋東山嵌入式linux系列-驅動進化之路:總線設備驅動模型

1 驅動編寫的 3 種方法 以 LED 驅動為例 1.1 傳統寫法 使用哪個引腳&#xff0c;怎么操作引腳&#xff0c;都寫死在代碼中。 最簡單&#xff0c;不考慮擴展性&#xff0c;可以快速實現功能。 修改引腳時&#xff0c;需要重新編譯。 應用程序調用open等函數最簡單的方法是驅動…

(深度估計學習)Depth Anything V2 復現

Depth Anything V2 復現 一、配置環境二、準備數據1. 權重文件2. 訓練數據 三、Test四、Train 代碼&#xff1a;https://github.com/DepthAnything/Depth-Anything-V2 一、配置環境 在本機電腦win跑之后依舊爆顯存&#xff0c;放到服務器跑&#xff1a;Ubuntu22.04&#xff0c…

使用Zabbix進行服務監控:構建高效穩定的IT服務管理平臺

使用Zabbix進行服務監控&#xff1a;構建高效穩定的IT服務管理平臺 在當今的數字化時代&#xff0c;IT服務管理&#xff08;ITSM&#xff09;對于確保企業IT系統的穩定性和性能至關重要。服務監控是ITSM的重要組成部分&#xff0c;可以幫助企業實時了解IT系統的運行狀況&#…

微調Qwen2大語言模型加入領域知識

目錄 試用Qwen2做推理安裝LLaMA-Factory使用自有數據集微調Qwen2驗證微調效果 試用Qwen2做推理 參考&#xff1a;https://qwen.readthedocs.io/en/latest/getting_started/quickstart.html from transformers import AutoModelForCausalLM, AutoTokenizer device "cuda…

極速構建的藝術:Kylin中Cube的并行構建實踐

極速構建的藝術&#xff1a;Kylin中Cube的并行構建實踐 引言 Apache Kylin是一款開源的分布式分析引擎&#xff0c;專為處理大規模數據集的即時查詢而設計。Kylin通過構建數據立方體&#xff08;Cube&#xff09;來優化查詢性能。隨著數據量的不斷增長&#xff0c;Cube的構建…

9.6 柵格圖層符號化唯一值著色渲染

文章目錄 前言多波段彩色渲染唯一值著色QGis設置為唯一值著色二次開發代碼實現唯一值著色 總結 前言 介紹柵格圖層數據渲染之唯一值著色渲染說明&#xff1a;文章中的示例代碼均來自開源項目qgis_cpp_api_apps 多波段彩色渲染唯一值著色 以“with_color_table.tif”數據為例…

硅谷甄選4(項目主體)

1.路由配置 1.1路由組件的雛形 src\views\home\index.vue&#xff08;以home組件為例&#xff09; 安裝插件&#xff1a; 1.2路由配置 1.2.1路由index文件 src\router\index.ts //通過vue-router插件實現模板路由配置 import { createRouter, createWebHashHistory } fro…

B站學習Java路線

Java 基礎 【零基礎 快速學Java】韓順平 零基礎30天學會Java JVM 尚硅谷宋紅康JVM全套教程&#xff08;詳解java虛擬機&#xff09; Java 并發 JUC

react-router實現路由攔截,useLocation,useNavigate鉤子

路由攔截 react-router中沒有直接給出攔截路由的方法&#xff0c;需要手動的去監聽路由的變化來攔截路由 路由攔截的要點&#xff1a; 能夠識別出目標路由和原始路由&#xff08;區分跳轉前和跳轉后&#xff09;能夠在跳轉時&#xff08;跳轉前或者跳轉后&#xff09;執行一些…

Python redis獲取的結果是字節不是字符串

Python redis獲取的結果是字節不是字符串 pool redis.ConnectionPool(hostlocalhost,port6379, passwordREDIS_PWD, decode_responsesTrue)需要指明給結果解碼decode_responsesTrue才能返回字符串

圖論基礎概念(詳細講解)

今天&#xff0c;我們講解一下圖論的概念&#xff0c;首先我們知道圖是一個什么東西。 圖你可以理解成一個網絡系統&#xff0c;兩個節點之間可能會有邊&#xff0c;邊鏈接兩個節點&#xff0c;可能是有向&#xff08;就比如說a只能往b,或者b只能往c)&#xff0c;可能是無向&a…

Vulnhub靶場 | DC系列 - DC1

https://www.vulnhub.com/series/dc,199/ 環境搭建 靶機鏡像下載地址&#xff1a;https://www.vulnhub.com/entry/dc-1,292/&#xff1b;需要將靶機和 kali 攻擊機放在同一個局域網里&#xff1b;本實驗kali 的 IP 地址&#xff1a;192.168.10.146。 滲透測試 1. 信息收集 …

CH16-DOM元素增刪改

CH16-DOM元素增刪改 本章目標 掌握如何使用DOM獲取節點時使用的屬性熟練使用DOM節點進行創建、添加、刪除、替換 一、使用DOM獲取節點時使用的屬性 1.1 首尾子節點 firstChild&#xff1a;獲取當前節點的首個子節點&#xff0c;注意&#xff1a;換行符、空格等也是節點。 …

【逆向】-異或-分組異或2

IDA查看源代碼 src長度32&#xff0c;encrypt函數加密&#xff0c;工4個參數&#xff0c;_FFFC雙擊&#xff0c;可以看到是個長度為7的固定值FnTest! 加密函數將4個參數又重新命名&#xff0c;混淆視聽&#xff0c;但是還是可以看到是嵌套循環&#xff0c;動態調試直接看結果可…

ArcGIS Pro SDK (八)地理數據庫 8 拓撲

ArcGIS Pro SDK &#xff08;八&#xff09;地理數據庫 8 拓撲 文章目錄 ArcGIS Pro SDK &#xff08;八&#xff09;地理數據庫 8 拓撲1 開放拓撲和進程定義2 獲取拓撲規則3 驗證拓撲4 獲取拓撲錯誤5 標記和不標記為錯誤6 探索拓撲圖7 找到最近的元素 環境&#xff1a;Visual …

C++11中重要的新特性之 lambda表達式 Part two

序言 在上一篇文章中&#xff0c;我們主要介紹了 C11 中的新增的關鍵詞&#xff0c;以及 范圍for循環 這類語法糖的使用和背后的邏輯。在這篇文章中我們會繼續介紹一個特別重要的新特性分別是 lambda表達式 。 1. lambda表達式 1.1 lambda的定義 C11 中的 lambda表達式 是一種…