log4j2異步的模式筑悴,采用的是disruptor高速并發(fā)框架肿男,所以速度很快纲堵,適合高并發(fā)的系統(tǒng)使用。
1棍辕、首先要去掉Spring Boot的默認(rèn)日志
主要是在spring-boot-starter增加例外暮现。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions><!-- 去掉依賴的默認(rèn)日志框架 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
2、引入log4j2的相關(guān)依賴
這里有兩種方式:
1)第一種引入Spring Boot的默認(rèn)配置楚昭,Spring Boot來引入相關(guān)的日志包栖袋。
<dependency> <!-- 引入log4j2依賴 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
2)第一種直接引入log4j2的相關(guān)配置。
這種方式需要引入兩個包抚太,一個是core核心實(shí)現(xiàn)塘幅,一個是API。
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.2</version>
</dependency>
以上兩種尿贫,二選一电媳,別重復(fù)引入。
3庆亡、引入disruptor并發(fā)框架
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.4.2</version>
</dependency>
4匾乓、設(shè)置異步模式
1)完全異步模式
在開始程序里面設(shè)置參數(shù),對于參數(shù)變量又谋,許多朋友可能看到過“Log4jContextSelector”拼缝,也看到過“l(fā)og4j2.contextSelector”,這兩個變量效果是一樣的彰亥。
System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
或者啟動參數(shù)里設(shè)置
-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
同樣是循環(huán)1W次咧七,輸出日志,最后的性能結(jié)果如下圖所示任斋。注意:因?yàn)槭钱惒降募套瑁钥刂婆_的日志就暫時不輸出了,否則控制臺看不到完成的時間。
2)異步/同步混合模式
在配置文件中Logger使用<asyncRoot> 或 <asyncLogger>,而且<asyncRoot> 或 <asyncLogger>可以和<root> 或 <logger>混合使用瘟檩。
主要改動為loggers里面的這一段犬第,增加異步日志輸入。
<AsyncLogger name="AsyncLogger" level="trace" includeLocation="true">
<appender-ref ref="RollingFileInfo" />
<appender-ref ref="RollingFileWarn" />
<appender-ref ref="RollingFileError" />
</AsyncLogger>
完整的log4j2配置為如下所示芒帕。
<?xml version="1.0" encoding="UTF-8"?>
<!--設(shè)置log4j2的自身log級別為warn-->
<!--日志級別以及優(yōu)先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status歉嗓,這個用于設(shè)置log4j2自身內(nèi)部的信息輸出,可以不設(shè)置背蟆,
當(dāng)設(shè)置成trace時鉴分,你會看到log4j2內(nèi)部各種詳細(xì)輸出-->
<!--monitorInterval:Log4j能夠自動檢測修改配置 文件和重新配置本身,設(shè)置間隔秒數(shù)-->
<configuration status="warn" monitorInterval="30">
<!--先定義所有的appender-->
<appenders>
<!--這個輸出控制臺的配置-->
<console name="Console" target="SYSTEM_OUT">
<!--輸出日志的格式-->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] [%t] - %l - %m%n"/>
</console>
<!-- 這個會打印出所有的info及以下級別的信息带膀,每次大小超過size志珍,
則這size大小的日志會自動存入按年份-月份建立的文件夾下面并進(jìn)行壓縮,作為存檔-->
<RollingFile name="RollingFileInfo" fileName="logs/log4j2/info.log"
filePattern="logs/log4j2/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
<Filters>
<!--控制臺只輸出level及以上級別的信息(onMatch)垛叨,其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] [%t] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
<RollingFile name="RollingFileWarn" fileName="logs/log4j2/warn.log"
filePattern="logs/log4j2/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] [%t] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<!-- DefaultRolloverStrategy屬性如不設(shè)置伦糯,則默認(rèn)為最多同一文件夾下7個文件,這里設(shè)置了20 -->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
<RollingFile name="RollingFileError" fileName="logs/log4j2/error.log"
filePattern="logs/log4j2/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="ERROR"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] [%t] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
</appenders>
<!--然后定義logger嗽元,只有定義了logger并引入的appender敛纲,appender才會生效-->
<loggers>
<AsyncLogger name="AsyncLogger" level="trace" includeLocation="true">
<appender-ref ref="RollingFileWarn" />
<appender-ref ref="RollingFileError" />
</AsyncLogger>
<root level="all">
<appender-ref ref="RollingFileInfo" />
</root>
</loggers>
</configuration>
這里需要注意的是,如果使用<asyncRoot> 或 <asyncLogger>剂癌,includeLocation="true"是必須要設(shè)置才會有類路徑等一些信息打印出來淤翔。最后的性能結(jié)果如下圖所示。
5佩谷、性能比較
最后說明旁壮,通過學(xué)習(xí)前面的同步配置,我們可以看出性能梯度為:
全異步>混合模式>同步
其它注意
本文章樣例:
工程名:spring-boot-log4j2-async
GitHub:https://github.com/zzyjb/SpringBootLearning