springboot使用log4j2異步日志提升性能的實現(xiàn)方式
同步日志的業(yè)務(wù)流程處理和日志打印是在同一個線程,日志打印的過程實際上是寫文件IO的過程,這個過程是相對耗時的,并且會阻塞主線程的執(zhí)行,只有日志打印完成后才會繼續(xù)執(zhí)行業(yè)務(wù)處理代碼。如果日志量比較大,會影響主業(yè)務(wù)流程的處理效率。異步日志實現(xiàn)方式:將日志存入一個單獨(dú)的隊列中,有一個單獨(dú)的線程從隊列中獲取日志并寫入磁盤文件。
- 日志放入隊列的耗時,肯定比磁盤寫IO文件耗時要少的多得多,所以對主業(yè)務(wù)流程影響極小。
- 一個單獨(dú)的線程進(jìn)行日志寫IO磁盤操作,所以不會阻塞主業(yè)務(wù)線程的執(zhí)行。
一、引入disruptor
Log4j2基于LMAX公司開發(fā)Disruptor(一個開源的無鎖并發(fā)框架),改善了Log4j和Logback在架構(gòu)設(shè)計方面的缺陷,具有超高的吞吐量和低延遲。所以我們想獲取log4j2異步日志帶來的性能提升,要先引入disruptor 。
<!-- Needed for Async Logging with Log4j 2 --> <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>3.3.6</version> </dependency>
二、 全局異步模式
全局異步模式對日志的輸出性能有非常大的提升,是官方推薦的異步日志輸出方式??梢杂袃煞N方式為Spring Boot應(yīng)用配置異步日志,第一種就是在應(yīng)用啟動類里面使用System.setProperty,代碼如下:
@SpringBootApplication public class BootLaunchApplication { public static void main(String[] args) { //下面語句使得Log4j2日志輸出使用異步處理,減小輸出日志對性能的影響 System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector"); SpringApplication.run(BootLaunchApplication.class, args); } }
第二種是通過啟動參數(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線程的時候,說明我們的全局異步日志配置成功了。
三、異步/同步混合模式
除了全局異步模式,slf4j還支持異步/同步混合模式。全局異步模式雖然是性能最好的日志輸出方式,但是也是耗費(fèi)主機(jī)資源最多的方式,如果你的應(yīng)用服務(wù)器性能一般,你又想獲得較好的日志輸出性能,可以采用如下的方法。
采用異步/同步混合模式就不需要配置第二小節(jié)中的Log4jContextSelector
在log4j2 xml里面對Loggers配置進(jìn)行改造,加入AsyncLogger
也就是異步日志,只針對com.zimug.boot.launch
包(假如已知這個包對處理性能要求比較高)下的代碼產(chǎn)生的日志采用異步模式,其他的日志仍然使用同步模式。
<Loggers> <!-- 針對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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java ThreadLocal類應(yīng)用實戰(zhàn)案例分析
這篇文章主要介紹了Java ThreadLocal類應(yīng)用,結(jié)合具體案例形式分析了java ThreadLocal類的功能、原理、用法及相關(guān)操作注意事項,需要的朋友可以參考下2019-09-09超詳細(xì)講解SpringBoot參數(shù)校驗實例
經(jīng)常需要提供接口與用戶交互(獲取數(shù)據(jù)、上傳數(shù)據(jù)等),由于這個過程需要用戶進(jìn)行相關(guān)的操作,為了避免出現(xiàn)一些錯誤的數(shù)據(jù)等,一般需要對數(shù)據(jù)進(jìn)行校驗,下面這篇文章主要給大家介紹了關(guān)于SpringBoot各種參數(shù)校驗的相關(guān)資料,需要的朋友可以參考下2022-05-05mybatis中string和date的轉(zhuǎn)換方式
這篇文章主要介紹了mybatis中string和date的轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08