[springboot]使用log4j2異步日志提升性能
文章目錄
一、引入disruptor
二、 全局異步模式
三、異步/同步混合模式
日志放入隊列的耗時,肯定比磁盤寫IO文件耗時要少的多得多,所以對主業務流程影響極小。
一個單獨的線程進行日志寫IO磁盤操作,所以不會阻塞主業務線程的執行。
一、引入disruptor
Log4j2基于LMAX公司開發Disruptor(一個開源的無鎖并發框架),改善了Log4j和Logback在架構設計方面的缺陷,具有超高的吞吐量和低延遲。所以我們想獲取log4j2異步日志帶來的性能提升,要先引入disruptor 。
1
2
3
4
5
6
二、 全局異步模式
全局異步模式對日志的輸出性能有非常大的提升,是官方推薦的異步日志輸出方式。可以有兩種方式為Spring Boot應用配置異步日志,第一種就是在應用啟動類里面使用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); } }
1
2
3
4
5
6
7
8
9
10
11
第二種是通過啟動參數來設置全局異步日志
java -jar -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector boot-launch-1.0.jar
1
在以上配置完成之后,我們可以在log日志打印的位置下斷點。當我們看到下圖中紅色邊框部分的Log4j2-TF-1-AsyncLogger線程的時候,說明我們的全局異步日志配置成功了。
三、異步/同步混合模式
除了全局異步模式,slf4j還支持異步/同步混合模式。全局異步模式雖然是性能最好的日志輸出方式,但是也是耗費主機資源最多的方式,如果你的應用服務器性能一般,你又想獲得較好的日志輸出性能,可以采用如下的方法。
采用異步/同步混合模式就不需要配置第二小節中的Log4jContextSelector
在log4j2 xml里面對Loggers配置進行改造,加入AsyncLogger也就是異步日志,只針對com.zimug.boot.launch包(假如已知這個包對處理性能要求比較高)下的代碼產生的日志采用異步模式,其他的日志仍然使用同步模式。
1
2
3
4
5
6
7
8
9
10
11
12
13
Spring Boot 任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。