• Spring Boot 整合 Log4j2 日志并压测性能


    1/ Log4j2的性能测试

    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/ 参考文档

    文末福利

    Java 资料大全 链接:https://pan.baidu.com/s/1pUCCPstPnlGDCljtBVUsXQ 密码:b2xc
    更多资料: 2020 年 精选阿里 Java、架构、微服务精选资料等,加 v ❤ :qwerdd111

    转载,请保留原文地址,谢谢 ~

  • 相关阅读:
    TCP链接异常断开后,对端仍然ESTABLISH
    mds0: Many clients (191) failing to respond to cache pressure
    Linux C/C++编译过程中的各种not declared in this scope
    Centos7添加磁盘并分区格式化
    Windows Terminal——安装并配置主题
    Kbone——创建项目报错 name can no longer contain capital letters
    Redis——大批量删除redis的key
    Redis——设置最大内存 | key淘汰机制
    Nightingale——滴滴夜莺部署【一】
    ELK——使用Docker快速搭建
  • 原文地址:https://www.cnblogs.com/Alandre/p/12704010.html
Copyright © 2020-2023  润新知