Spring Boot整合Log4j2实践日志

1、Log4j2的性能测试

Spring Boot整合Log4j2实践日志

从图中不难看出,在线程数为 2~16 之间,混合使用同步和异步的logger来打印日志,性能是最好的。

2/ 目标

  • 混合 sync/async

  • 彩色日志

  • 分类输出到不同文件

  • 自动压缩日志文件并归档

Spring Boot整合Log4j2实践日志

3/ 实现

0x01 Maven 依赖 pom.xml

 
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  3.    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  4.    <modelVersion>4.0.0</modelVersion>

  5.  

  6.    <groupId>org.spring</groupId>

  7.    <artifactId>springboot</artifactId>

  8.    <version>0.0.1-SNAPSHOT</version>

  9.    <packaging>jar</packaging>

  10.  

  11.    <name>springboot</name>

  12.    <description>Demo Log4j2 for Spring Boot</description>

  13.  

  14.    <parent>

  15.        <groupId>org.springframework.boot</groupId>

  16.        <artifactId>spring-boot-starter-parent</artifactId>

  17.        <version>1.5.4.RELEASE</version>

  18.    </parent>

  19.  

  20.    <properties>

  21.        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

  22.        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

  23.        <java.version>1.8</java.version>

  24.    </properties>

  25.  

  26.    <dependencies>

  27.  

  28.        <dependency>

  29.            <groupId>org.springframework.boot</groupId>

  30.            <artifactId>spring-boot-starter-web</artifactId>

  31.            <exclusions>

  32.                <exclusion>

  33.                    <groupId>org.springframework.boot</groupId>

  34.                    <artifactId>spring-boot-starter-logging</artifactId>

  35.                </exclusion>

  36.            </exclusions>

  37.        </dependency>

  38.  

  39.        <!-- 代码简化 -->

  40.        <dependency>

  41.            <groupId>org.projectlombok</groupId>

  42.            <artifactId>lombok</artifactId>

  43.            <version>1.16.16</version>

  44.        </dependency>

  45.  

  46.        <!-- 日志 Log4j2 -->

  47.        <dependency>

  48.            <groupId>org.springframework.boot</groupId>

  49.            <artifactId>spring-boot-starter-log4j2</artifactId>

  50.        </dependency>

  51.  

  52.        <!-- Log4j2 异步支持 -->

  53.        <dependency>

  54.            <groupId>com.lmax</groupId>

  55.            <artifactId>disruptor</artifactId>

  56.            <version>3.3.6</version>

  57.        </dependency>

  58.  

  59.    </dependencies>

  60.  

  61.    <build>

  62.        <plugins>

  63.            <plugin>

  64.                <groupId>org.springframework.boot</groupId>

  65.                <artifactId>spring-boot-maven-plugin</artifactId>

  66.            </plugin>

  67.        </plugins>

  68.    </build>

  69.  

  70. </project>

0x02 配置 Log4j2,在 resources 文件目录下添加文件 log4j2.xml,会被自动配置

 
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <!-- Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,

  3.     你会看到log4j2内部各种详细输出。可以设置成OFF(关闭) 或 Error(只输出错误信息)。

  4.     30s 刷新此配置

  5. -->

  6. <configuration status="WARN" monitorInterval="30">

  7.  

  8.    <!-- 日志文件目录、压缩文件目录、日志格式配置 -->

  9.    <properties>

  10.        <Property name="fileName">/Users/admin/Code/log</Property>

  11.        <Property name="fileGz">/Users/admin/Code/log/7z</Property>

  12.        <Property name="PID">????</Property>

  13.        <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>

  14.    </properties>

  15.  

  16.    <Appenders>

  17.        <!-- 输出控制台日志的配置 -->

  18.        <Console name="console" target="SYSTEM_OUT">

  19.            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->

  20.            <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>

  21.            <!-- 输出日志的格式 -->

  22.            <PatternLayout pattern="${LOG_PATTERN}"/>

  23.        </Console>

  24.  

  25.        <!-- 打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->

  26.        <RollingRandomAccessFile name="infoFile" fileName="${fileName}/web-info.log" immediateFlush="false"

  27.                                    filePattern="${fileGz}/$${date:yyyy-MM}/%d{yyyy-MM-dd}-%i.web-info.gz">

  28.            <PatternLayout pattern="${LOG_PATTERN}"/>

  29.  

  30.            <Policies>

  31.                <SizeBasedTriggeringPolicy size="20 MB"/>

  32.            </Policies>

  33.  

  34.            <Filters>

  35.                <!-- 只记录info和warn级别信息 -->

  36.                <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>

  37.                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>

  38.            </Filters>

  39.  

  40.            <!-- 指定每天的最大压缩包个数,默认7个,超过了会覆盖之前的 -->

  41.            <DefaultRolloverStrategy max="50"/>

  42.        </RollingRandomAccessFile>

  43.  

  44.        <!-- 存储所有error信息 -->

  45.        <RollingRandomAccessFile name="errorFile" fileName="${fileName}/web-error.log" immediateFlush="false"

  46.                                    filePattern="${fileGz}/$${date:yyyy-MM}/%d{yyyy-MM-dd}-%i.web-error.gz">

  47.            <PatternLayout pattern="${LOG_PATTERN}"/>

  48.  

  49.            <Policies>

  50.                <SizeBasedTriggeringPolicy size="50 MB"/>

  51.            </Policies>

  52.  

  53.            <Filters>

  54.                <!-- 只记录error级别信息 -->

  55.                <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>

  56.            </Filters>

  57.  

  58.            <!-- 指定每天的最大压缩包个数,默认7个,超过了会覆盖之前的 -->

  59.            <DefaultRolloverStrategy max="50"/>

  60.        </RollingRandomAccessFile>

  61.    </Appenders>

  62.  

  63.    <!-- Mixed sync/async -->

  64.    <Loggers>

  65.        <Root level="debug" includeLocation="true">

  66.            <AppenderRef ref="console"/>

  67.            <AppenderRef ref="infoFile"/>

  68.            <AppenderRef ref="errorFile"/>

  69.        </Root>

  70.  

  71.        <AsyncRoot level="debug" includeLocation="true">

  72.            <AppenderRef ref="console"/>

  73.            <AppenderRef ref="infoFile"/>

  74.            <AppenderRef ref="errorFile"/>

  75.        </AsyncRoot>

  76.    </Loggers>

  77.  

  78. </configuration>

0x03 添加 Application 启动类

 
  1. @SpringBootApplication

  2. @EnableScheduling

  3. public class Application {

  4.  

  5.    public static void main(String[] args) {

  6.        SpringApplication.run(Application.class, args);

  7.    }

  8.  

  9. }

0x04 添加测试的 Job 类

 
  1. @Component

  2. @Log4j2

  3. public class LogJob {

  4.  

  5.    /**

  6.     * 2秒钟执行1次

  7.     */

  8.    @Scheduled(fixedRate = 2 * 1000)

  9.    public void logging(){

  10.        Date now = new Date();

  11.        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");

  12.        log.info(simpleDateFormat.format(now));

  13.        log.debug("-------DEBUG---------");

  14.        log.error(now.getTime());

  15.    }

  16.  

  17. }

0x05 大致文件目录结构

Spring Boot整合Log4j2实践日志

4/ 参考文档

  • RollingRandomAccessFileAppender

  • MixedSync-Async

Spring Boot 整合 HBase

Spring Batch 轻量级批处理框架实践

Spring Boot CMS 开发实践