Log4j2 AsyncLogger - Spring Boot 168 EP 7-1

Log4j2 AsyncLogger – Spring Boot 168 EP 7-1

處理異步日誌輸出時,執行輸出與業務邏輯並不是在同一個執行緒中執行,而是使用了另一條執行緒處理操作,而處理業務邏輯的執行緒,就可以在不用等待的狀態下,立即執行後續的流程邏輯,同樣也支援各種級別的日誌, EP 7-1 增加了 LMAX 相依套件。

前言

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 Web 執行主程式
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: 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,一個良好易於管理的日誌系統,是不可或缺的一部份。

發佈留言