java日志框架系列(9):logback框架过滤器(filter)详解
过滤器放在了logback-classic模块中。
1.logback-classic模块中过滤器
分类(2种):常规过滤器、TurboFilter过滤器。
1.常规过滤器
常规过滤器可以通过自定义进行条件筛选过滤。
目前logback-classic中有2个常规过滤器:级别过滤器(LevelFilter)、临界值过滤器(ThresholdFilter)。在logback-core中还有一个求值过滤器(EvaluatorFilter)。
1.自定义过滤器
创建自定义过滤器很容易,只需要继承Filter抽象类并实现decide()方法。
下面就通过范例来了解如何创建自定义过滤器吧。
1.范例
public class SampleFilter extends Filter<ILoggingEvent> {
@Override
public FilterReply decide(ILoggingEvent event) {
if (event.getMessage() != null && event.getMessage().contains("sample")) {
return FilterReply.ACCEPT;
} else {
return FilterReply.NEUTRAL; }
}
}
配置xml配置文件,代码如下:
match就是匹配的意思,那mismatch当然就是不匹配啦。
由于常规过滤器可以根据事件包含的某些信息进行过滤,那么当然可以根据级别进行过滤了。下面介绍一下级别过滤器:
1.级别过滤器(LevelFilter)
级别过滤器xml配置示例:
这个配置表示:当级别为INFO时,decide()方法会响应ACCEPT;否则响应DENY。
<filter>标签包含3个子标签:<level> 、<onMatch> 、<onMismatch>。
<level>功能: 用于指定过滤的级别。
<onMatch>功能:指定级别匹配时响应的值。值为FilterReply的枚举。
<onMismatch>功能:指定级别不匹配时响应的值。值为FilterReply的枚举。
FilterReply的值:ACCEPT 、NEUTRAL、DENY。
2.临界值过滤器(ThresholdFilter)
临界值过滤器xml配置示例:
这个配置表明当级别等于或高于<filter>中的子标签<level>指定的级别时,decide()方法会响应NEUTRAL;否则decide方法会响应DENY。
2.TurboFilter过滤器
常用的TurboFilter过滤器(3类):MDCFilter、MarkerFilter、DuplicateFilter。
TurboFilter过滤器与常规过滤器作用范围不同。
常规过滤器Filter作用范围:仅仅是某个logger。如果与这个loggerA关联的appenderB中配置了常规过滤器C,那么每当这个loggerA发起记录请求的时候都会调用这个常规过滤器C。但是未与appenderB关联的logger发起记录请求时无法调用这个常规过滤器C。
TurboFilter过滤器作用范围:整个Logger上下文。就是所有的logger发起记录请求时都会调用这个TurboFilter类型过滤器。
根据他们的作用范围不同,因此我们可以猜测出在配置文件中他们所处的位置肯定是不同的。
过滤器位置
常规过滤器Filter位置:位于appender内。常规过滤器用<filter>标签,是<appender>的子标签。
TurboFilter过滤器位置:位于configuration内。TurboFilter过滤器用<turboFilter>标签,是<configuration>子标签。
1.自定义TurboFilter过滤器
想要自定义TurboFilter过滤器,必须创建一个类,且该类必须继承TurboFilter抽象类并实现decide()方法。
下面我们通过示例来了解一下如何创建自定义TurboFilter过滤器。
创建并使用自定义TurboFilter过滤器步骤(2步):
1.创建继承TurboFilter抽象类的类SampleTurboFilter。
2.在xml配置文件中配置TurboFilter过滤器。
示例:
package chapters.filters;
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.turbo.TurboFilter;
import ch.qos.logback.core.spi.FilterReply;
public class SampleTurboFilter extends TurboFilter {
String marker;
Marker markerToAccept;
@Override
public FilterReply decide(Marker marker, Logger logger, Level level,String format, Object[] params, Throwable t) {
if (!isStarted()) {
return FilterReply.NEUTRAL;
}
if ((markerToAccept.equals(marker))) {
return FilterReply.ACCEPT;
} else {
return FilterReply.NEUTRAL;
}
}
public String getMarker() {
return marker;
}
public void setMarker(String markerStr) {
this.marker = markerStr;
}
@Override
public void start() {
if (marker != null && marker.trim().length() > 0) {
markerToAccept = MarkerFactory.getMarker(marker);
super.start();
}
}
}
下面在配置文件中使用自定义的TurboFilter过滤器。 配置文件如下所示:
2.logback-classic中直接使用的TurboFilter过滤器
logback-classic实现的TurboFilter过滤器(2种):MDCFilter、MarkerFilter。
1.MDCFilter过滤器介绍
注意:<turboFilter>标签在<appender>标签外面。
2.MarkerFilter过滤器介绍
MarkerFilter会检查与记录事件相关联的某个特定marker是否存在,从而决定响应哪个值(ACCEPT 、NEUTRAL 、DENY)。
配置如下:
3.重复消息过滤器(DuplicateMessageFilter)
重复消息过滤器也是TurboFilter过滤器的一种。
重复消息过滤器的配置如下:
2.logback-core模块中的过滤器
logback-core中只包含了求值过滤器,但是求值过滤器是一个抽象类。
求值过滤器也是有一个常规过滤器。
1.求值过滤器(EvaluatorFilter)
java日志框架系列(9):logback框架过滤器(filter)详解的更多相关文章
- Spring框架系列(6) - Spring IOC实现原理详解之IOC体系结构设计
在对IoC有了初步的认知后,我们开始对IOC的实现原理进行深入理解.本文将帮助你站在设计者的角度去看IOC最顶层的结构设计.@pdai Spring框架系列(6) - Spring IOC实现原理详解 ...
- Spring框架系列(7) - Spring IOC实现原理详解之IOC初始化流程
上文,我们看了IOC设计要点和设计结构:紧接着这篇,我们可以看下源码的实现了:Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的. ...
- Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等)
上文,我们看了IOC设计要点和设计结构:以及Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的:容器中存放的是Bean的定义即Be ...
- Spring框架系列(9) - Spring AOP实现原理详解之AOP切面的实现
前文,我们分析了Spring IOC的初始化过程和Bean的生命周期等,而Spring AOP也是基于IOC的Bean加载来实现的.本文主要介绍Spring AOP原理解析的切面实现过程(将切面类的所 ...
- Spring框架系列(10) - Spring AOP实现原理详解之AOP代理的创建
上文我们介绍了Spring AOP原理解析的切面实现过程(将切面类的所有切面方法根据使用的注解生成对应Advice,并将Advice连同切入点匹配器和切面类等信息一并封装到Advisor).本文在此基 ...
- Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现
我们在前文中已经介绍了SpringAOP的切面实现和创建动态代理的过程,那么动态代理是如何工作的呢?本文主要介绍Cglib动态代理的案例和SpringAOP实现的原理.@pdai Spring框架系列 ...
- Spring框架系列(12) - Spring AOP实现原理详解之JDK代理实现
上文我们学习了SpringAOP Cglib动态代理的实现,本文主要是SpringAOP JDK动态代理的案例和实现部分.@pdai Spring框架系列(12) - Spring AOP实现原理详解 ...
- SpringMVC 框架系列之组件概述与配置详解
在上一篇文章 SpringMVC 框架系列之初识与入门实例 的实例中,我们已经知道,SpringMVC 框架是一个 web 层的框架,本篇文章就详细解释一下 SpringMVC 框架具体文件的配置以及 ...
- java Web 过滤器Filter详解
简介 Filter也称之为过滤器,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊 ...
- Servlet中的过滤器Filter详解
加载执行顺序 context-param->listener->filter->servlet web.xml中元素执行的顺序listener->filter->stru ...
随机推荐
- 页面嵌套iframe时,怎样让iframe高度根据自身内容高度自适应
总体思路是这样的,因为iframe里页面的内容是动态加载的,而且电脑屏幕宽度发生变化时,也得相应的去改变iframe标签的高度(如果高度确定就不用这么麻烦了): 首先,我们在父页面中定义一个方法,用来 ...
- Python基础之给函数增加元信息
1. 参数注解 当写好一个函数以后,想为这个函数的参数添加一些额外的信息,这样的话,其他的使用者就可以清楚的知道这个函数应该怎么使用,这个时候可以使用函数参数注解. 函数参数注解能提示程序员应该怎样正 ...
- codeforces#1228E. Another Filling the Grid(容斥定理,思维)
题目链接: https://codeforces.com/contest/1228/problem/E 题意: 给n*n的矩阵填数,使得每行和每列最小值都是1 矩阵中可以填1到$k$的数 数据范围: ...
- Spring Cloud Gateway(四):路由定义定位器 RouteDefinitionLocator
本文基于 spring cloud gateway 2.0.1 1.简介 RouteDefinitionLocator 是路由定义定位器的顶级接口,它的主要作用就是读取路由的配置信息(org.spri ...
- Linux 如何通过某一台服务器调用执行多台远程服务器上的脚本,结果显示在本地?
现在都流行自动化运维了,可能目前技术不够,很多自动化工具还不怎么会用,所以本次只是通过ssh来实现功能. 说明:自己写的一个简单脚本,只是实现了基础功能,还有待优化. 一共三台机器: master:1 ...
- OpenFOAM中的基本变量快速认知【转载】
转载自:http://blog.sina.com.cn/s/blog_a0b4201d0102vsf9.html label 实际上就是整型数据的变体,int,OF对它进行了包装,以适应32或64位系 ...
- JDBC的概述和简单使用
1. 概念 JDBC是 Java DataBase Connectivity 的简写,翻译过来就是 Java 操作数据库. 目的是使用统一的Java代码操作所有关系型数据库. JDBC实际是定义了一套 ...
- RK3399 4G模块移远EC20移植调试
转载请注明出处:https://www.cnblogs.com/lialong1st/p/11266330.html CPU:RK3399 系统:Android 7.1 1.通过串口打印或者adb获取 ...
- qt sql 数据库操作
1. 连接数据库 mysql连接: QSqlDatabase mysql_db=QSqlDatabase::addDatabase("QMYSQL","mysql_co ...
- keras Model 3 共享的层
1 入门 2 多个输入和输出 3 共享层 考虑这样的一个问题:我们要判断连个tweet是否来源于同一个人. 首先我们对两个tweet进行处理,然后将处理的结构拼接在一起,之后跟一个逻辑回归,输出这两条 ...