SpringBoot(三) Log4j2 日志组件

最近调试代码和运行代码的时候,一些日志打印的乱七八槽,根据日志很难快速定位到问题,感觉自己是为了打印日志而打印日志,花了点时间把日志的相关整理了一下,意在让日志发挥最大的作用。

Log4j2 性能实测

logback log4j log4j2 性能实测

构建项目

(1)添加Log4j2 依赖
(2)去掉默认的日志配置

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<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.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<!-- 引入log4j2依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>

</dependencies>

application.yml

指定日志配置文件 -> log4j2.xml

1
2
3
#log4j2
logging:
config: classpath:log4j2.xml

log4j2 剖析

主要结构


appenders 里设置日志的输出方式、级别和格式
loggers 里设置全局的级别和绑定appenders里的name

说明
属性 作用 子属性作用
Console 控制台日志
PatternLayout 格式化输出日志
ThresholdFilter “阈值筛选器” 可单独设置appender的输出级别
File 日志输出到文件,可配置覆盖还是追加
RollingFile “滚动文件” 可作为按日输出日志的方式
loggers 匹配每个appender的名称 name

log4j2.xml

现有这个需求,我要打印到控制台的日志级别为Error,日志文件里保存的是INFO级别的日志,这样在产生错误的时候,就不会被大量无用的代码干扰,要使用ThresholdFilter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
<Appenders>
<!--控制台输出-->
<Console name="Console" target="SYSTEM_OUT">
<!--只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%highlight{%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %M() @%L - %msg%n}{FATAL=Bright Red, ERROR=Bright Magenta, WARN=Bright Yellow, INFO=Bright Green, DEBUG=Bright Cyan, TRACE=Bright White}"/>
</Console>

<!--append="false" 会在服务每次启动的时候清空日志(覆盖)-->
<!--<File name="ERROR" fileName="log/error.log" append="false">-->
<!--<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>-->
<!--<PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %M() @%L - %msg%n"/>-->
<!--</File>-->

<!--这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingInfoFile" fileName="log/all.log"
filePattern="logs/info/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %M() @%L - %msg%n"/>
<SizeBasedTriggeringPolicy size="5MB"/>
</RollingFile>

<!-- error 日志 -->
<RollingFile name="RollingErrorFile" fileName="log/error.log"
filePattern="logs/error/$${date:yyyy-MM}/error-%d{MM-dd-yyyy}-%i.log.gz">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %M() @%L - %msg%n"/>
<SizeBasedTriggeringPolicy size="5MB"/>
</RollingFile>

</Appenders>
<Loggers>
<Root level="INFO">
<!--<appender-ref ref="ERROR" />-->
<appender-ref ref="RollingInfoFile"/>
<appender-ref ref="RollingErrorFile"/>
<appender-ref ref="Console"/>
</Root>
</Loggers>
</Configuration>

简单说明

appender: Console、File、RollingFile
(1)Console 通过ThresholdFilter过滤规则只输出ERROR级别的错误(onMatch=”ACCEPT” onMismatch=”DENY” 匹配到的接受,没有匹配的走人)
(2)File 也通过ThresholdFilter的方式输出到日志,当然了append=”false” 会在服务每次启动的时候清空日志(覆盖)
(3)RollingFile 因为日志全局设置的为INFO,所以不需要ThresholdFilter,这里只需要指定filePattern和SizeBasedTriggeringPolicy就行了

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@RunWith(SpringRunner.class)
@SpringBootTest
public class Springboot20302ApplicationTests {

private static Logger logger = LogManager.getLogger(Springboot20302ApplicationTests.class);

@Test
public void contextLoads() {

logger.debug("我是DEBUG日志");
logger.info("我是INFO日志");
logger.warn("我是WARN日志");
logger.error("我是ERROR日志");
logger.fatal("我是FATAL日志");
}

}

执行代码

查看各文件和控制台

-------------- 本文结束  感谢您的阅读 --------------