首先要在项目的pom.xml中做如下修改,有注释的地方都是需要手动添加的:
<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目录下,配置的含义在注释中都讲得很清楚了:
<!--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;
class SpringbootLogstudyApplicationTests {
private static final Logger LOGGER = LoggerFactory.getLogger(SpringbootLogstudyApplicationTests.class);
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万次,来看看效果:
执行的速度非常的快,这是控制台:
这是文件目录:
这是日志html文件:
就这样,springboot集成log4j2日志框架测试成功了。
文章评论