1、Log4j2的性能测试
从图中不难看出,在线程数为 2~16 之间,混合使用同步和异步的logger来打印日志,性能是最好的。
2/ 目标
-
混合 sync/async
-
彩色日志
-
分类输出到不同文件
-
自动压缩日志文件并归档
3/ 实现
0x01 Maven 依赖 pom.xml
-
<?xml version="1.0" encoding="UTF-8"?>
-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
<modelVersion>4.0.0</modelVersion>
-
-
<groupId>org.spring</groupId>
-
<artifactId>springboot</artifactId>
-
<version>0.0.1-SNAPSHOT</version>
-
<packaging>jar</packaging>
-
-
<name>springboot</name>
-
<description>Demo Log4j2 for Spring Boot</description>
-
-
<parent>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-parent</artifactId>
-
<version>1.5.4.RELEASE</version>
-
</parent>
-
-
<properties>
-
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-
<java.version>1.8</java.version>
-
</properties>
-
-
<dependencies>
-
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-web</artifactId>
-
<exclusions>
-
<exclusion>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-logging</artifactId>
-
</exclusion>
-
</exclusions>
-
</dependency>
-
-
<!-- 代码简化 -->
-
<dependency>
-
<groupId>org.projectlombok</groupId>
-
<artifactId>lombok</artifactId>
-
<version>1.16.16</version>
-
</dependency>
-
-
<!-- 日志 Log4j2 -->
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-log4j2</artifactId>
-
</dependency>
-
-
<!-- Log4j2 异步支持 -->
-
<dependency>
-
<groupId>com.lmax</groupId>
-
<artifactId>disruptor</artifactId>
-
<version>3.3.6</version>
-
</dependency>
-
-
</dependencies>
-
-
<build>
-
<plugins>
-
<plugin>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-maven-plugin</artifactId>
-
</plugin>
-
</plugins>
-
</build>
-
-
</project>
0x02 配置 Log4j2,在 resources 文件目录下添加文件 log4j2.xml,会被自动配置
-
<?xml version="1.0" encoding="UTF-8"?>
-
<!-- Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,
-
你会看到log4j2内部各种详细输出。可以设置成OFF(关闭) 或 Error(只输出错误信息)。
-
30s 刷新此配置
-
-->
-
<configuration status="WARN" monitorInterval="30">
-
-
<!-- 日志文件目录、压缩文件目录、日志格式配置 -->
-
<properties>
-
<Property name="fileName">/Users/admin/Code/log</Property>
-
<Property name="fileGz">/Users/admin/Code/log/7z</Property>
-
<Property name="PID">????</Property>
-
<Property name="LOG_PATTERN">%clr{%d{yyyy-MM-dd HH:mm:ss.SSS}}{faint} %clr{%5p} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n%xwEx</Property>
-
</properties>
-
-
<Appenders>
-
<!-- 输出控制台日志的配置 -->
-
<Console name="console" target="SYSTEM_OUT">
-
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
-
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
-
<!-- 输出日志的格式 -->
-
<PatternLayout pattern="${LOG_PATTERN}"/>
-
</Console>
-
-
<!-- 打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
-
<RollingRandomAccessFile name="infoFile" fileName="${fileName}/web-info.log" immediateFlush="false"
-
filePattern="${fileGz}/$${date:yyyy-MM}/%d{yyyy-MM-dd}-%i.web-info.gz">
-
<PatternLayout pattern="${LOG_PATTERN}"/>
-
-
<Policies>
-
<SizeBasedTriggeringPolicy size="20 MB"/>
-
</Policies>
-
-
<Filters>
-
<!-- 只记录info和warn级别信息 -->
-
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
-
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
-
</Filters>
-
-
<!-- 指定每天的最大压缩包个数,默认7个,超过了会覆盖之前的 -->
-
<DefaultRolloverStrategy max="50"/>
-
</RollingRandomAccessFile>
-
-
<!-- 存储所有error信息 -->
-
<RollingRandomAccessFile name="errorFile" fileName="${fileName}/web-error.log" immediateFlush="false"
-
filePattern="${fileGz}/$${date:yyyy-MM}/%d{yyyy-MM-dd}-%i.web-error.gz">
-
<PatternLayout pattern="${LOG_PATTERN}"/>
-
-
<Policies>
-
<SizeBasedTriggeringPolicy size="50 MB"/>
-
</Policies>
-
-
<Filters>
-
<!-- 只记录error级别信息 -->
-
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
-
</Filters>
-
-
<!-- 指定每天的最大压缩包个数,默认7个,超过了会覆盖之前的 -->
-
<DefaultRolloverStrategy max="50"/>
-
</RollingRandomAccessFile>
-
</Appenders>
-
-
<!-- Mixed sync/async -->
-
<Loggers>
-
<Root level="debug" includeLocation="true">
-
<AppenderRef ref="console"/>
-
<AppenderRef ref="infoFile"/>
-
<AppenderRef ref="errorFile"/>
-
</Root>
-
-
<AsyncRoot level="debug" includeLocation="true">
-
<AppenderRef ref="console"/>
-
<AppenderRef ref="infoFile"/>
-
<AppenderRef ref="errorFile"/>
-
</AsyncRoot>
-
</Loggers>
-
-
</configuration>
0x03 添加 Application 启动类
-
@SpringBootApplication
-
@EnableScheduling
-
public class Application {
-
-
public static void main(String[] args) {
-
SpringApplication.run(Application.class, args);
-
}
-
-
}
0x04 添加测试的 Job 类
-
@Component
-
@Log4j2
-
public class LogJob {
-
-
/**
-
* 2秒钟执行1次
-
*/
-
@Scheduled(fixedRate = 2 * 1000)
-
public void logging(){
-
Date now = new Date();
-
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
-
log.info(simpleDateFormat.format(now));
-
log.debug("-------DEBUG---------");
-
log.error(now.getTime());
-
}
-
-
}
0x05 大致文件目录结构
4/ 参考文档
-
RollingRandomAccessFileAppender
-
MixedSync-Async