Log4j2的Filters配置详解(ThresholdFilter )

官方配置文档 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 就算 匹配上了 . 可选值为ACCEPTDENYNEUTRAL。默认值为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 就算 匹配上了 . 可选值为ACCEPTDENYNEUTRAL。默认值为NEUTRAL.
onMismatch匹配失败。对不符合过滤级别的日志的操作。可选值为ACCEPT、DENY和NEUTRAL。默认值为DENY

示例:只允许打印5:00-5:30的日志,其余时间段的日志拒绝掉。

<TimeFilter start="05:00:00" end="05:30:00" onMatch="ACCEPT" onMismatch="DENY"/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五月天的尾巴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值