全栈工程师_java全栈工程师_全栈开发者学习经验总结

  • 首页
  • 开发工具
    • 软件安装
    • 软件使用
  • 前端
    • Ionic
    • Android
    • Capacitor
    • Angular
    • Vue
    • 苹果开发者账号
  • 后端
    • Java
    • Python
    • MyBatis
    • Spring
    • SpringBoot
    • SpringMVC
    • SpringCloud
  • 服务器
    • Linux
    • MySQL
    • Nginx
    • Tomcat
    • Docker
  • 其他
    • 生活碎片
    • 报错专区
  • 我
lipsuper
专注产出高质量原创手打文章
  1. 首页
  2. 后端
  3. Java
  4. 正文

springboot集成log4j2实现同步以及异步日志记录

2020年7月1日 796点热度 0人点赞 0条评论

如果说log4j的性能是绿皮火车,那么logback就是高铁,而log4j2就是磁悬浮列车。由于优异的性能,在现在的项目中越来越多的使用log4j2。接下来就是springboot项目集成log4j2的使用方法。

首先要在项目的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.lipsuper</groupId>
    <artifactId>springboot_logstudy</artifactId>
    <version>1.0.0</version>
    <name>springboot_logstudy</name>
    <description>Demo project for Spring Boot Logging</description>
​
    <properties>
        <java.version>1.8</java.version>
    </properties>
​
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!--排除掉默认的日志记录框架:logback-->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--添加新的日志记录框架:log4j2-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <!--异步日志依赖-->
        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.3.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
​
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
​
</project>
​

然后就是创建log4j2.xml配置文件,放在resources目录下,配置的含义在注释中都讲得很清楚了:

<?xml version="1.0" encoding="UTF-8"?>
<!--status="warn"表示日志框架自身的日志输出级别为warn,不是必要的,可以不写;
    monitorInterval="5"表示日志配置文件自动加载的间隔时间为5秒,该值不能低于5,用于生产环境可以热更新日志配置文件-->
<configuration status="error" monitorInterval="5">
    <!--集中配置属性进行管理,使用的时候通过el表达式来引用-->
    <properties>
        <!--自定义控制台日志输出格式-->
        <property name="CONSOLE_PATTERN" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c:%L %M  [%thread] %m%n"/>
        <!--自定义日志文件名称为项目名加版本-->
        <property name="FILE_NAME" value="springboot_log"/>
        <!--日志文件储存路径-->
        <property name="FILE_HOME" value="H:/log"/>
    </properties>
​
    <!--定义所有的appender-->
    <appenders>
        <!--自定义控制台输出appender-->
        <console name="consoleAppender" target="SYSTEM_OUT">
            <!--输出日志的格式-->
            <PatternLayout pattern="${CONSOLE_PATTERN}"/>
        </console>
​
        <!--使用随机读写流输出appender-->
        <RandomAccessFile name="accessFileAppender" fileName="${FILE_HOME}/myAccessLog.log">
            <!--输出日志的格式-->
            <PatternLayout pattern="${CONSOLE_PATTERN}"/>
        </RandomAccessFile>
​
        <!-- 自定义文件输出appender,这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面            并进行压缩,作为存档-->
        <RollingFile name="rollingFileAppender" fileName="${FILE_HOME}/${FILE_NAME}.html"
                     filePattern="${FILE_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.html">
            <!--日志级别过滤器-->
            <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--日志消息格式-->
            <HTMLLayout>%d{yyyy-MM-dd HH:mm:ss}%thread%-5level%c%m</HTMLLayout>
            <Policies>
                <!--在系统启动时,触发拆分规则,产生一个新的日志文件-->
                <OnStartupTriggeringPolicy/>
                <!--按照时间节点进行拆分,规则是上面的"filePattern"来定义的-->
                <TimeBasedTriggeringPolicy/>
                <!--按照文件大小进行拆分-->
                <SizeBasedTriggeringPolicy size="1MB"/>
            </Policies>
            <!--同一目录下,文件的最大个数 为30个,超过就进行覆盖-->
            <DefaultRolloverStrategy max="30"/>
        </RollingFile>
    </appenders>
​
    <loggers>
        <!--自定义局部异步Logger对象
            includeLocation="false"表示关闭日志记录的行号信息,不关闭的话严重影响性能
            additivity="false"表示不继承rootLogger对象
        -->
        <AsyncLogger name="com.lipsuper" level="debug" includeLocation="false" additivity="false">
            <AppenderRef ref="rollingFileAppender"/>
        </AsyncLogger>
​
        <root level="debug">
            <appender-ref ref="consoleAppender"/>
        <!--<appender-ref ref="rollingFileAppender"/>-->
        </root>
    </loggers>
</configuration>

上面的配置文件需要注意的是以下部分,我专门提出来了:

 <loggers>
        <!--自定义局部异步Logger对象
            includeLocation="false"表示关闭日志记录的行号信息,不关闭的话严重影响性能
            additivity="false"表示不继承rootLogger对象
        -->
        <AsyncLogger name="com.lipsuper" level="debug" includeLocation="false" additivity="false">
            <AppenderRef ref="rollingFileAppender"/>
        </AsyncLogger>
​
        <root level="debug">
            <appender-ref ref="consoleAppender"/>
        <!--<appender-ref ref="rollingFileAppender"/>-->
        </root>
    </loggers>

这里定义了两个logger对象,一个是rootLogger,一个是我自定义的异步Logger名字叫做"com.lipsuper",可以看出,输出到控制台的日志我使用的是rootLogger,也就没有使用异步输出。

而输出到文件的日志我采用了自定义的异步输出。

以上的异步输出配置方法就叫做局部异步配置方法。当然了,有局部就有全局,下面的配置就是全局异步的配置方法:

# 全局异步配置,也就是输出到控制台和文件都会采用异步的方式,不能和局部异步方法同时存在
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

如果需要全局异步,那就在resources文件目录下创建一个名叫log4j2.component.properties的文件,然后把上面那行配置放进去就行了。

注意:全局异步和局部异步不能同时存在。这两个你必须注释掉一个才行。

接下来就是我们的测试类:

从引入的包可以看出,我们依然使用的是slf4j作为日志门面,这也是业界常规的做法。你当然可以使用log4j2自己作为日志门面,但一般不这样。

package com.lipsuper.springboot_logstudy;
​
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
​
@SpringBootTest
class SpringbootLogstudyApplicationTests {
​
    private static final Logger LOGGER = LoggerFactory.getLogger(SpringbootLogstudyApplicationTests.class);
​
    @Test
    void testQuick() {
        for (int i = 0; i < 50000; i++) {
            LOGGER.error("lipsuper-error");
            LOGGER.warn("lipsuper-warn");
            LOGGER.info("lipsuper-info");
            LOGGER.debug("lipsuper-debug");
            LOGGER.trace("lipsuper-trace");
        }
    }
​
}

上面的测试方法循环执行5万次,来看看效果:

执行的速度非常的快,这是控制台:

slf4j-log4j2控制台输出

这是文件目录:

slf4j-log4j2文件输出目录

这是日志html文件:

slf4j-log4j2html文件

 

就这样,springboot集成log4j2日志框架测试成功了。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 保姆级指导 经验总结
最后更新:2020年7月1日

lipsuper

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

取消回复

COPYRIGHT © 2021 lipsuper.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

渝ICP备2021004735号-1

渝公网安备 50011202502306号