處理異步日誌輸出時,執行輸出與業務邏輯並不是在同一個執行緒中執行,而是使用了另一條執行緒處理操作,而處理業務邏輯的執行緒,就可以在不用等待的狀態下,立即執行後續的流程邏輯,同樣也支援各種級別的日誌, EP 7-1 增加了 LMAX 相依套件。
Table of Contents
Toggle前言
Log4j2 是一個日誌框架,提供日常的開發,測試和生產環境中,記錄了應用,服務運行過程中的訊息,以及出現異常時的例外,這些資訊常常作為查詢,定位,解決問題的關鍵。
Log4j2 AsyncLogger
檔案目錄
./
+- build.gradle
| +- src
| +- main
| +- resources
| | +- log4j2.xml
+- logs
+- spring-boot-168.log
Gradle
build.gradle
增加 LMAX。
修改完後,點右鍵,Gradle -> Refresh Gradle Project 。
buildscript {
group 'org.ruoxue.spring-boot-168'
version = '0.0.1-SNAPSHOT'
ext {
lmaxVersion = '3.4.4'
}
}
plugins {
id 'java-library'
}
repositories {
jcenter()
}
dependencies {
implementation "com.lmax:disruptor:${lmaxVersion}"
}
設定
log4j2.xml
新增檔案,增加 AsyncRoot 、 AsyncLogger 。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="60">
<Properties>
<Property name="LOG_PATTERN"
value="%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} [%thread] %p %c{1}#%M:%L - %m%n%ex" />
<Property name="LOG_PATH">logs</Property>
<Property name="LOG_FILE">spring-boot-168</Property>
</Properties>
<Appenders>
<Console name="ConsoleAppender" target="SYSTEM_OUT"
follow="true">
<PatternLayout pattern="${LOG_PATTERN}" />
</Console>
<RollingRandomAccessFile name="FileAppender"
fileName="${LOG_PATH}/${LOG_FILE}.log"
filePattern="${LOG_PATH}/${LOG_FILE}-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout>
<Pattern>${LOG_PATTERN}</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="2GB" />
</Policies>
<DefaultRolloverStrategy max="10" />
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<AsyncRoot level="INFO">
<AppenderRef ref="ConsoleAppender" level="INFO" />
<AppenderRef ref="FileAppender" level="INFO" />
</AsyncRoot>
<AsyncLogger name="org.springframework.jdbc" level="INFO"
additivity="false">
<Appender-Ref ref="ConsoleAppender" />
</AsyncLogger>
</Loggers>
</Configuration>
測試
Application.main
在主程式點右鍵執行 Run As -> Java Application,查看 console,Server 已成功啟動,監聽 10000 port,並在此目錄下輸出成檔案, logs/spring-boot-168.log。

. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.7.RELEASE)
2022-11-14T01:12:04.999+0800 [main] INFO JettyWebServer#: - Jetty started on port(s) 10000 (http/1.1) with context path '/'
2022-11-14T01:12:05.105+0800 [main] INFO Application#: - Started Application in 11.676 seconds (JVM running for 12.46)
心得分享
使用的是第三方的異步框架 LMAX ,其中的核心阻塞佇列採用了 Disruptor ,實現高吞吐,單執行緒能支撐每秒 600 萬訂單,開發或維運時,當系統運行發生異常,往往最先查找的就是 log,一個良好易於管理的日誌系統,是不可或缺的一部份。