springboot使用log4j2異步日志提升性能的實(shí)現(xiàn)方式
同步日志的業(yè)務(wù)流程處理和日志打印是在同一個(gè)線程,日志打印的過(guò)程實(shí)際上是寫文件IO的過(guò)程,這個(gè)過(guò)程是相對(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公司開(kāi)發(fā)Disruptor(一個(gè)開(kāi)源的無(wú)鎖并發(fā)框架),改善了Log4j和Logback在架構(gòu)設(shè)計(jì)方面的缺陷,具有超高的吞吐量和低延遲。所以我們想獲取log4j2異步日志帶來(lái)的性能提升,要先引入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) {
//下面語(yǔ)句使得Log4j2日志輸出使用異步處理,減小輸出日志對(duì)性能的影響
System.setProperty("Log4jContextSelector",
"org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
SpringApplication.run(BootLaunchApplication.class, args);
}
}第二種是通過(guò)啟動(dòng)參數(shù)來(lái)設(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í)候,說(shuō)明我們的全局異步日志配置成功了。

三、異步/同步混合模式
除了全局異步模式,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 ThreadLocal類應(yīng)用實(shí)戰(zhàn)案例分析
這篇文章主要介紹了Java ThreadLocal類應(yīng)用,結(jié)合具體案例形式分析了java ThreadLocal類的功能、原理、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-09-09
超詳細(xì)講解SpringBoot參數(shù)校驗(yàn)實(shí)例
經(jīng)常需要提供接口與用戶交互(獲取數(shù)據(jù)、上傳數(shù)據(jù)等),由于這個(gè)過(guò)程需要用戶進(jìn)行相關(guān)的操作,為了避免出現(xiàn)一些錯(cuò)誤的數(shù)據(jù)等,一般需要對(duì)數(shù)據(jù)進(jìn)行校驗(yàn),下面這篇文章主要給大家介紹了關(guān)于SpringBoot各種參數(shù)校驗(yàn)的相關(guān)資料,需要的朋友可以參考下2022-05-05
mybatis中string和date的轉(zhuǎn)換方式
這篇文章主要介紹了mybatis中string和date的轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
java在文件尾部追加內(nèi)容的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇java在文件尾部追加內(nèi)容的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
SpringBoot升級(jí)指定jackson版本的問(wèn)題
這篇文章主要介紹了SpringBoot升級(jí)指定jackson版本,本文給大家分享了漏洞通告及修改Springboot中jackson版本的問(wèn)題,需要的朋友可以參考下2022-08-08

