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

logback之自定义过滤器

logback有两种过滤器,一种是context中的过滤器叫TurboFilter,是一个全局的过滤器,会影响所有的日志记录。另一种是Appender中的过滤器,只对所在的append有效。两者大同小异,这里我们以Appender的过滤器为例。

(一)自定义一个过滤器

我们先实现一个LevelRangeFilter,目的是对日志区间进行过滤,只有在[minLevel,maxLevel)中的日志事件才允许输出到日志文件中,如下:

package com.mall.common.log;import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.AbstractMatcherFilter;
import ch.qos.logback.core.spi.FilterReply;/*** @author Lft* @since 2024/12/30 21:49*/
public class LevelRangeFilter extends AbstractMatcherFilter<ILoggingEvent> {Level minLevel;Level maxLevel;@Overridepublic FilterReply decide(ILoggingEvent event) {if (!isStarted()) {return FilterReply.NEUTRAL;}if (minLevel == null) {if (!event.getLevel().isGreaterOrEqual(maxLevel)) {return onMatch;} else {return onMismatch;}} else if (maxLevel == null) {if (event.getLevel().isGreaterOrEqual(minLevel)) {return onMatch;} else {return onMismatch;}}if (event.getLevel().isGreaterOrEqual(minLevel) && !event.getLevel().isGreaterOrEqual(maxLevel)) {return onMatch;} else {return onMismatch;}}public void setMinLevel(Level minLevel) {this.minLevel = minLevel;}public void setMaxLevel(Level maxLevel) {this.maxLevel = maxLevel;}public void start() {if (this.minLevel != null || this.maxLevel != null) {super.start();}}
}

过滤器的过滤方法decide很简单,只是对日志事件的级别进行判断,是否在[minLevel,maxLevel)进行判断,支持[,maxLevel)以及[minLevel,)。

几个注意事项:

(1)过滤器必须实现Filter接口,这里建议继承AbstractMatcherFilter

(2)minLevel和maxLevel这两个属性是自定义的,需要在xml配置文件中配置,那么需要提供set方法,以便xml解析时能够通过隐式规则进行设置。

(3)提供start方法,更符合它的设计理念。

(二)xml配置文件配置过滤器

<configuration scan="true" scanPeriod="1 minute" debug="true"><!--<turboFilter class=""/>--><!-- Appenders --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/logback.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>logs/logback.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory> <!-- 保留最近30天的日志文件 --></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><appender name="impossible" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/impossible.log</file><rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"><fileNamePattern>impossible.%i.log.zip</fileNamePattern><minIndex>1</minIndex><maxIndex>3</maxIndex></rollingPolicy><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>5MB</maxFileSize></triggeringPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} %msg%n</pattern></encoder><filter class="com.mall.common.log.LevelRangeFilter"><minLevel>WARN</minLevel><maxLevel>ERROR</maxLevel><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><logger name="impossible" additivity="false"><appender-ref ref="impossible"/></logger><!-- Root Logger --><root level="Info"><appender-ref ref="CONSOLE"/><appender-ref ref="ROLLING"/></root>
</configuration>

过滤器配置日志级别是[WARN,ERROR),所以只会输出WARN级别日志。

使用如上测试程序,运行如下:

ps:日志过滤器如何生效的源码,在上一篇《logback日志框架源码分析》中的第四节-打印日志中有详细介绍,想了解的可转到那篇进行了解,这里不再重复介绍

http://www.lryc.cn/news/513582.html

相关文章:

  • 如何用CSS3创建圆角矩形并居中显示?
  • Java 开发中的指定外部 Jar 路径详解
  • python爬虫--小白篇【selenium自动爬取文件】
  • TI毫米波雷达原始数据解析之Lane数据交换
  • overscroll-behavior-解决H5在ios上过度滚动的默认行为
  • Nacos配置中心总结
  • rouyi(前后端分离版本)配置
  • 超大规模分类(一):噪声对比估计(Noise Contrastive Estimation, NCE)
  • Windows 下安装 triton 教程
  • 复盘与导出工具最新版9.15重磅发布-全新UI兼容所有windows系统
  • 家用电器销售系统|Java|SSM|JSP|
  • NRF24L01模块通信实验
  • 2024年12月CCF-GESP编程能力等级认证Scratch图形化编程三级真题解析
  • 【MySQL系列】VARCHAR为啥一般是255
  • 图文教程:使用PowerDesigner导出数据库表结构为Word/Html文档
  • Coroutine 基础五 —— Flow 之 Channel 篇
  • 快速掌握Elasticsearch检索之二:滚动查询(scrool)获取全量数据(golang)
  • C++设计模式:状态模式(自动售货机)
  • 【网络安全实验室】脚本关实战详情
  • ts总结一下
  • MySQL数据库笔记——主从复制
  • OpenAI发布o3:圣诞前夜的AI惊喜,颠覆性突破还是技术焦虑?
  • 欧拉-伯努利梁自由波动的频散关系
  • Cursor小试1.生成一个网页的接口请求工具
  • Xilinx DCI技术
  • Kubernetes Pod 优雅关闭:如何让容器平稳“退休”?
  • 鸿蒙应用开发(1)
  • SimForge HSF 案例分享|复杂仿真应用定制——UAVSim无人机仿真APP(技术篇)
  • 使用 Adaptive Mesh Refinement 加速 CFD 仿真:最佳实践
  • 前端-动画库Lottie 3分钟学会使用