Log4j2的Filters配置详解(ThresholdFilter )
文章目录
- 一、什么是Filters
- 1.1、ThresholdFilter
- 1.1.1、场景1:不加ThresholdFilter
- 1.1.2、场景2:单个ThresholdFilter
- 1.1.3、场景3:多个ThresholdFilter
- 1.2、TimeFilter
官方配置文档 https://logging.apache.org/log4j/2.x/manual/filters.html
一、什么是Filters
通过ACCEPT(接受)
, DENY(拒绝)
, NEUTRAL(放行)
来对不同级别的日志进行过滤。
常用的Filter实现类有:
- LevelRangeFilter
- TimeFilter
- ThresholdFilter:匹配至少与配置级别一样严重的日志事件。(即>=配置级别的放行)
1.1、ThresholdFilter
属性 | 描述 |
---|---|
level | 日志级别。例如,level="ERROR"表示只有错误级别的日志会被过滤。 |
onMatch | 匹配成功。日志级别 >= level 就算 匹配上了 . 可选值为ACCEPT 、DENY 和NEUTRAL 。默认值为NEUTRAL . |
onMismatch | 匹配失败。对不符合过滤级别的日志的操作。可选值为ACCEPT、DENY和NEUTRAL。默认值为DENY 。 |
1.1.1、场景1:不加ThresholdFilter
仅受到root level
控制
<?xml version="1.0" encoding="UTF-8"?>
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration monitorInterval="5">
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<appenders>
<console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%F:%L] - %msg%n"/>
</console>
</appenders>
<loggers>
<root level="all">
<appender-ref ref="Console" />
</root>
</loggers>
</configuration>
2024-12-31 15:43:29.767 TRACE [UserController.java:61] - 测试消息-trace
2024-12-31 15:43:29.767 DEBUG [UserController.java:62] - 测试消息-debug
2024-12-31 15:43:29.767 INFO [UserController.java:63] - 测试消息-info
2024-12-31 15:43:29.768 WARN [UserController.java:64] - 测试消息-warn
2024-12-31 15:43:29.768 ERROR [UserController.java:65] - 测试消息-error
root level
是第一道门,仅打印>=level级别的日志。 测试日志使用的是@Slf4j注解,并没有fatal级别的日志,所以代码中没有测试fatal级别。
SLF4j注解没有FATAL级别日志。SLF4j本身并没有FATAL级别的日志,其日志级别从高到低依次为OFF、ERROR、WARN、INFO、DEBUG、TRACE、ALL。因此,在使用SLF4j注解时,无法直接使用FATAL级别的日志记录功能
<root level="warn">
<appender-ref ref="Console" />
</root>
2024-12-31 15:43:29.768 WARN [UserController.java:64] - 测试消息-warn
2024-12-31 15:43:29.768 ERROR [UserController.java:65] - 测试消息-error
1.1.2、场景2:单个ThresholdFilter
root level
为第一道门,ThresholdFilter level
为第二道门
<appenders>
<console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%F:%L] - %msg%n"/>
<!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
</console>
</appenders>
<loggers>
<root level="all">
<appender-ref ref="Console" />
</root>
</loggers>
第1道门: <root level="all"> ==> 放行所有
第2道门: <ThresholdFilter level="info"> 会 ACCEPT >= INFO 的 FATAL, ERROR, WARN, INFO
2024-12-31 15:43:29.767 INFO [UserController.java:63] - 测试消息-info
2024-12-31 15:43:29.768 WARN [UserController.java:64] - 测试消息-warn
2024-12-31 15:43:29.768 ERROR [UserController.java:65] - 测试消息-error
<appenders>
<console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%F:%L] - %msg%n"/>
<Filters>
<!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
</Filters>
</console>
</appenders>
<loggers>
<root level="warn">
<appender-ref ref="Console" />
</root>
</loggers>
第1道门: <root level="warn"> >=warn放行
第2道门: <ThresholdFilter level="info"> >=info的放行,因为root level仅放行warn、error, 所以这里仅打印>=warn的日志
2024-12-31 15:43:29.768 WARN [UserController.java:64] - 测试消息-warn
2024-12-31 15:43:29.768 ERROR [UserController.java:65] - 测试消息-error
1.1.3、场景3:多个ThresholdFilter
<appenders>
<console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%F:%L] - %msg%n"/>
<Filters>
<!-- >= error 的 FATAL ERROR 被 DENY,< error 的 WARN INFO DEBUG TRACE不拒绝不接受,直接放行让后序filter处理-->
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<!-- >= info 的 FATAL ERROR WARN INFO 被 ACCEPT,< info 的 DEBUG TRACE拒绝-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</console>
</appenders>
<root level="all">
<AppenderRef ref="CONSOLE"/>
</root>
第1道门: 全放行: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL
第2道门: 第1层ThresholdFilter: 过滤掉: OFF > FATAL > ERROR > 还剩: WARN > INFO > DEBUG > TRACE > ALL
第3道门: 第2层ThresholdFilter: WARN > INFO > 过滤掉: DEBUG > TRACE > ALL 还剩: WARN > INFO
2024-12-31 15:43:29.767 INFO [UserController.java:63] - 测试消息-info
2024-12-31 15:43:29.768 WARN [UserController.java:64] - 测试消息-warn
1.2、TimeFilter
时间过滤器可用于将过滤器限制在一天中的特定时间段。
属性 | 描述 |
---|---|
start | 起始时间 HH:mm:ss格式 |
end | 结束时间 HH:mm:ss 格式。指定的结束时间小于开始时间将导致不写入日志项 |
onMatch | 匹配成功。日志级别 >= level 就算 匹配上了 . 可选值为ACCEPT 、DENY 和NEUTRAL 。默认值为NEUTRAL . |
onMismatch | 匹配失败。对不符合过滤级别的日志的操作。可选值为ACCEPT、DENY和NEUTRAL。默认值为DENY 。 |
示例:只允许打印5:00-5:30的日志,其余时间段的日志拒绝掉。
<TimeFilter start="05:00:00" end="05:30:00" onMatch="ACCEPT" onMismatch="DENY"/>