在 springboot 中使用 log4j 需要引入其依賴並把 springboot 自帶的日志框架 logback 排除掉:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
=============================================================================
引入log4j2(同log4j一樣,要排除 springboot 自帶的日志框架):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- 增加識別yaml格式依賴,加上這個才能辨認到log4j2.yml文件 -->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
</dependency>
log4j2 異步日志
到目前為止,上述的測試都是針對同步日志進行的測試。在確定了log4j2
作為日志框架之后,我想看一下,使用異步日志能不能進一步提高性能表現。
AsyncAppender 和 Asynchronous Loggers
官方文檔也指出:
在這種多線程應用的實踐中需要主要:阻塞隊列很容易發生鎖爭用,測試表明當大量線程並發寫日志的時候,性能甚至會變得更糟糕。所以應該考慮使用無鎖的Asyn Loggers進行優化。
上述的Asyn Loggers
是log42
團隊后來才加入的異步實現,連官方文檔都推薦它了,那還有什么好猶豫的呢。它需要引入一個額外的依賴:
<dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>3.4.2</version> </dependency>
Disruptor
通過CAS而不是鎖實現多生產者、多消費者對RingBuffer的並發訪問,實現高吞吐和高性能。
全異步和混合異步
Log4j2的異步日志的使用又可以分為全異步和混合異步,所謂全異步就是所有的日志都以異步方式輸出;混合異步就是只有指定的代碼文件用異步方式輸出,其他日志使用同步方式輸出;前者能夠獲得更高的性能,也是官方推薦的方式,后者具有更好的靈活性,可以進行針對性配置。
本文中我們直接使用全異步日志。
在springboot中開啟全異步的方式很簡單,只需要在配置文件中加如下配置(yml):
log4j2: contextSelector: org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
或者在用java -jar
啟動的時候加入系統參數:
-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
springboot 中多環境日志配置
在springboot中我們通常針對dev,test,live等多種環境會有多套配置文件,比如application-dev.yml
,application-test.yml
, application-live.yml
。然后可以在啟動的時候可以通過在全局配置文件application.yml
指定某個配置文件來啟用配置:
sping: profiles: active: live
日志同樣有這樣的需求,不同環境使用不同的日志配置,比如dev或test環境需要開啟的log level為DEBUG
,而在live環境中卻不需要。這種時候我們只需要寫多套日志配置,比如log4j2-dev.yml
,log4j2-test.yml
,log4j2-live.yml
,然后在其對應的配置文件中啟用日志配置就可以了:
logging: config: classpath:log4j2-dev.yml