測試:同步情況下 結果如下:
log4j 測試列印 100000次 平均值在 17秒~18秒左右。
log4j2 測試列印 100000次 平均值在 15秒左右。
異步處理模式:
所有日志均為異步執行。
使用方式:
pom.xml
<!--Web依賴- 排除自帶的tomcat-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions><!-- 去掉logback配置 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency> <!-- 引入log4j2依賴 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- 開啟異步必須要加入下面依賴,否者會抛異常-->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.4.2</version>
</dependency>
配置方式:
<?xml version='1.0' encoding='UTF-8' ?>
<configuration status="info" name="defaultLogConfig" monitorInterval="10">
<properties>
<property name="PRO_NAME">logs</property>
<property name="PATTERN_LAYOUT">%date{dd HH:mm:ss.SSS} %highlight{%-5level}|%style{%X{requestId}}|%l:%m%n </property>
<!-- <property name="PATTERN_LAYOUT">%d %highlight{%-5level}{ERROR=Bright RED, WARN=Bright Yellow, INFO=Bright Green, DEBUG=Bright Cyan, TRACE=Bright White} %style{[%t]}{bright,magenta} %style{%c{1.}.%M(%L)}{cyan}: %msg%n</property>-->
<property name="PATTERN_ERROR">%date{dd HH:mm:ss.SSS} %highlight{%-5level|%X{requestId}| %l:%m%n}
</property>
</properties>
<Appenders>
<Console name="ConsoleInfo" target="SYSTEM_OUT" follow="true">
<Filters>
<!-- 如果是error級别拒絕-->
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<!-- 如果是debug\info\warn輸出-->
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="${PATTERN_LAYOUT}" charset="UTF-8"/>
</Console>
<Console name="ConsoleError" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="${PATTERN_ERROR}" charset="UTF-8"/>
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</Console>
<!--warn及以下日志-->
<RollingFile name="FileInfo" fileName="${PRO_NAME}/info.log"
filePattern="${PRO_NAME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd HH時mm分}-%i.log.gz">
<PatternLayout pattern="${PATTERN_LAYOUT}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="6" modulate="true"/>
<!--單個檔案大小-->
<SizeBasedTriggeringPolicy size="100MB"/>
</Policies>
<!--儲存日志檔案個數-->
<DefaultRolloverStrategy max="10"/>
</RollingFile>
<!--error級别日志 單獨再儲存一份 輸出-->
<RollingFile name="FileError" fileName="${PRO_NAME}/error.log"
filePattern="${PRO_NAME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd HH mm ss}-%i.log.gz">
<PatternLayout pattern="${PATTERN_ERROR}"/>
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<Policies>
<!-- 間隔6小時 -->
<TimeBasedTriggeringPolicy interval="6" modulate="true"/>
<SizeBasedTriggeringPolicy size="100MB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
<!-- 普通日志 通過異步輸出-->
<Async name="FileInfoAsync" bufferSize="1024" >
<AppenderRef ref="FileInfo"/>
</Async>
<Async name="ConsoleFileInfoAsync" bufferSize="1024" >
<AppenderRef ref="ConsoleInfo"/>
</Async>
</Appenders>
<Loggers>
<!-- 異步日志沒法列印 位置資訊包括:%C or %class, %F or %file, %l or %location, %L or %line, %M or %method 報錯行數 等關鍵資訊-->
<!-- 錯誤日志通過異步輸出-->
<Logger name="com.yxkj" level="info" additivity="false">
<!-- 上線的時候必須将控制台列印注釋掉ConsoleError ConsoleFileInfoAsync -->
<AppenderRef ref="ConsoleError"/>
<AppenderRef ref="ConsoleInfo"/>
<!-- <AppenderRef ref="ConsoleFileInfoAsync"/>-->
<!-- 下面為檔案日志列印 -->
<AppenderRef ref="FileInfoAsync"/>
<AppenderRef ref="FileError"/>
</Logger>
<!-- <AsyncLogger level="INFO" includeLocation="true">-->
<!-- <AppenderRef ref="ConsoleError"/>-->
<!-- <AppenderRef ref="ConsoleInfo"/>-->
<!-- <AppenderRef ref="FileInfo"/>-->
<!-- <AppenderRef ref="FileError"/>-->
<!-- </AsyncLogger>-->
</Loggers>
</configuration>