springboot使用log4j2異步日志提升性能的實(shí)現(xiàn)方式
同步日志的業(yè)務(wù)流程處理和日志打印是在同一個(gè)線程,日志打印的過程實(shí)際上是寫文件IO的過程,這個(gè)過程是相對(duì)耗時(shí)的,并且會(huì)阻塞主線程的執(zhí)行,只有日志打印完成后才會(huì)繼續(xù)執(zhí)行業(yè)務(wù)處理代碼。如果日志量比較大,會(huì)影響主業(yè)務(wù)流程的處理效率。異步日志實(shí)現(xiàn)方式:將日志存入一個(gè)單獨(dú)的隊(duì)列中,有一個(gè)單獨(dú)的線程從隊(duì)列中獲取日志并寫入磁盤文件。
- 日志放入隊(duì)列的耗時(shí),肯定比磁盤寫IO文件耗時(shí)要少的多得多,所以對(duì)主業(yè)務(wù)流程影響極小。
- 一個(gè)單獨(dú)的線程進(jìn)行日志寫IO磁盤操作,所以不會(huì)阻塞主業(yè)務(wù)線程的執(zhí)行。

一、引入disruptor
Log4j2基于LMAX公司開發(fā)Disruptor(一個(gè)開源的無鎖并發(fā)框架),改善了Log4j和Logback在架構(gòu)設(shè)計(jì)方面的缺陷,具有超高的吞吐量和低延遲。所以我們想獲取log4j2異步日志帶來的性能提升,要先引入disruptor 。
<!-- Needed for Async Logging with Log4j 2 -->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.6</version>
</dependency>二、 全局異步模式
全局異步模式對(duì)日志的輸出性能有非常大的提升,是官方推薦的異步日志輸出方式??梢杂袃煞N方式為Spring Boot應(yīng)用配置異步日志,第一種就是在應(yīng)用啟動(dòng)類里面使用System.setProperty,代碼如下:
@SpringBootApplication
public class BootLaunchApplication {
public static void main(String[] args) {
//下面語句使得Log4j2日志輸出使用異步處理,減小輸出日志對(duì)性能的影響
System.setProperty("Log4jContextSelector",
"org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
SpringApplication.run(BootLaunchApplication.class, args);
}
}第二種是通過啟動(dòng)參數(shù)來設(shè)置全局異步日志
java -jar -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector boot-launch-1.0.jar
在以上配置完成之后,我們可以在log日志打印的位置下斷點(diǎn)。當(dāng)我們看到下圖中紅色邊框部分的Log4j2-TF-1-AsyncLogger線程的時(shí)候,說明我們的全局異步日志配置成功了。

三、異步/同步混合模式
除了全局異步模式,slf4j還支持異步/同步混合模式。全局異步模式雖然是性能最好的日志輸出方式,但是也是耗費(fèi)主機(jī)資源最多的方式,如果你的應(yīng)用服務(wù)器性能一般,你又想獲得較好的日志輸出性能,可以采用如下的方法。
采用異步/同步混合模式就不需要配置第二小節(jié)中的Log4jContextSelector
在log4j2 xml里面對(duì)Loggers配置進(jìn)行改造,加入AsyncLogger也就是異步日志,只針對(duì)com.zimug.boot.launch包(假如已知這個(gè)包對(duì)處理性能要求比較高)下的代碼產(chǎn)生的日志采用異步模式,其他的日志仍然使用同步模式。
<Loggers>
<!-- 針對(duì)com.zimug.boot.launch包下面的日志采用異步日志 -->
<AsyncLogger name="com.zimug.boot.launch" level="debug" additivity="false">
<AppenderRef ref="CONSOLE" level="debug"/>
<AppenderRef ref="FILE-APPENDER" level="info"/>
</AsyncLogger>
<!-- 系統(tǒng)默認(rèn)日志設(shè)置 -->
<Root level="debug">
<AppenderRef ref="CONSOLE" level="debug"/>
<AppenderRef ref="FILE-APPENDER" level="info"/>
</Root>
</Loggers>到此這篇關(guān)于springboot使用log4j2異步日志提升性能的文章就介紹到這了,更多相關(guān)springboot log4j2異步日志內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java并發(fā)機(jī)制的底層實(shí)現(xiàn)原理分析
本文主要介紹了Java中并發(fā)編程中常用的一些機(jī)制,包括volatile、synchronized和原子操作,volatile是輕量級(jí)的同步機(jī)制,保證了共享變量的可見性;synchronized是一種重量級(jí)的同步機(jī)制,通過加鎖和解鎖來保證線程安全2025-01-01
使用Spring的JAVA Mail支持簡化郵件發(fā)送功能
這篇文章主要為大家詳細(xì)介紹了使用Spring的JAVA Mail支持簡化郵件發(fā)送功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
Java的幾個(gè)重要版本_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
jdk8 將在2014年3月份發(fā)布,迄今為止,可能是最大更新的java版本,也是令人期待的一個(gè)版本,在Java中引入閉包概念對(duì)Java程序開發(fā)方法的影響甚至?xí)笥贘ava5中引入的泛型特征對(duì)編程方式帶來的影響2017-06-06
Java toString方法重寫工具之ToStringBuilder案例詳解
這篇文章主要介紹了Java toString方法重寫工具之ToStringBuilder案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
java微信開發(fā)API第二步 獲取和回復(fù)消息
這篇文章主要為大家詳細(xì)介紹了java微信開發(fā)API第二步,獲取消息和回復(fù)消息,感興趣的小伙伴們可以參考一下2016-06-06
java使用ArrayList實(shí)現(xiàn)斗地主(無序版)
這篇文章主要為大家詳細(xì)介紹了java使用ArrayList實(shí)現(xiàn)斗地主,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03
Java double轉(zhuǎn)BigDecimal的注意事項(xiàng)說明
這篇文章主要介紹了Java double轉(zhuǎn)BigDecimal的注意事項(xiàng)說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01
Java ArrayList與Vector和LinkedList的使用及源碼分析
ArrayList、Vector、LinkedList類均在java.util包中,均為可伸縮數(shù)組,即可以動(dòng)態(tài)改變長度的數(shù)組。ArrayList 和 Vector都是基于存儲(chǔ)元素的Object[] array來實(shí)現(xiàn)的,它們會(huì)在內(nèi)存中開辟一塊連續(xù)的內(nèi)存來存儲(chǔ)2022-11-11

