当前位置: 首页 > article >正文

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 就算 匹配上了 . 可选值为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"/>

http://www.kler.cn/a/460248.html

相关文章:

  • MySQL 入门大全:运算符
  • 国产编辑器EverEdit - 常用资源汇总
  • JavaWeb开发(五)Servlet-ServletContext
  • Python 字符串定义及前缀
  • 树莓派linux内核源码编译
  • C++ 设计模式:中介者模式(Mediator Pattern)
  • ROS自学笔记三十:话题消息输出并转换为Excel形式
  • python钉钉机器人
  • 【探商宝】企业查询多维度解析---创新信息篇
  • [硬件] DELL BIOS 相关注意事项
  • 【漏洞复现】金和OA C6 FileDownLoad.aspx 任意文件读取漏洞复现
  • ImageSharp:高性能跨平台.NET开源图形库
  • Java垃圾回收机制与垃圾收集器
  • 期末速成C++【继承与派生 多态与虚函数】
  • TCP/IP 协议演进中的瓶颈,权衡和突破
  • VSCode快捷键Ctrl+/是注释;Ctrl+\是拆分编辑器;Ctrl+w是关闭编辑器
  • Jenkins 中的清理工作空间工作原理
  • 明达助力锻压设备工厂数字化改造
  • 0-指针网络(NIPS15)
  • 7-58 输出不重复的数组元素
  • 租赁系统的数字化转型与高效管理新模式分析
  • 谷云科技数据集成社区焕新登场:功能、资源、会员权益全面升级
  • 【Element-UI 级联选择器 一级多选 二级单选】
  • LeetCode - 初级算法 数组(两个数组的交集 II)
  • Three.js教程005:
  • C/C++ 数据结构与算法【哈夫曼树】 哈夫曼树详细解析【日常学习,考研必备】带图+详细代码