测试:同步情况下 结果如下:
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>