java 日志框架 详解_java日志框架系列(9):logback框架过滤器(filter)详解

过滤器放在了logback-classic模块中。

1.logback-classic模块中过滤器

分类(2种):常规过滤器、TurboFilter过滤器。

1.常规过滤器

ef6108c4fe2d07f81e21f8fc0906ae4a.png

常规过滤器可以通过自定义进行条件筛选过滤。

目前logback-classic中有2个常规过滤器:级别过滤器(LevelFilter)、临界值过滤器(ThresholdFilter)。在logback-core中还有一个求值过滤器(EvaluatorFilter)。

1.自定义过滤器

创建自定义过滤器很容易,只需要继承Filter抽象类并实现decide()方法。

下面就通过范例来了解如何创建自定义过滤器吧。

1.范例

功能:自定义 SampleFilter 类,当记录事件的消息字段包含字符串“sample”时,它的 decide

方法返回 ACCEPT,其他情况下返回 NEUTRAL。

步骤:(2步)

1.创建继承Filter抽象类的Sample类并实现decide()方法。

2.在xml配置文件中配置过滤器。

定义过滤器SampleFilter,代码如下:

public class SampleFilter extends Filter{

@OverridepublicFilterReply decide(ILoggingEvent event) {if (event.getMessage() != null &&event.getMessage().contains("sample")) {returnFilterReply.ACCEPT;

}else{return FilterReply.NEUTRAL; }

}

}

配置xml配置文件,代码如下:

f3fdc40968201f6526394a6b49725b66.png

11df08cb068b4a25f9234c1cedf667ae.png

ddb77d3c90dd9552ca2b2373ad87402e.png

165bfea46a977fa733e3a7b188aa28d2.png

match就是匹配的意思,那mismatch当然就是不匹配啦。

由于常规过滤器可以根据事件包含的某些信息进行过滤,那么当然可以根据级别进行过滤了。下面介绍一下级别过滤器:

1.级别过滤器(LevelFilter)

009fba6042c98275e1402354490647f9.png

级别过滤器xml配置示例:

00946578dc2c513e19b074e5377b160c.png

这个配置表示:当级别为INFO时,decide()方法会响应ACCEPT;否则响应DENY。

标签包含3个子标签: 、 、。

功能: 用于指定过滤的级别。

功能:指定级别匹配时响应的值。值为FilterReply的枚举。

功能:指定级别不匹配时响应的值。值为FilterReply的枚举。

FilterReply的值:ACCEPT 、NEUTRAL、DENY。

2.临界值过滤器(ThresholdFilter)

46ceef7149a2500a773e6a789a280271.png

临界值过滤器xml配置示例:

4e28015b4f7222d5ce292bf3d38bc537.png

这个配置表明当级别等于或高于中的子标签指定的级别时,decide()方法会响应NEUTRAL;否则decide方法会响应DENY。

2.TurboFilter过滤器

常用的TurboFilter过滤器(3类):MDCFilter、MarkerFilter、DuplicateFilter。

4b198c26377a179592265282cb063d7b.png

TurboFilter过滤器与常规过滤器作用范围不同。

常规过滤器Filter作用范围:仅仅是某个logger。如果与这个loggerA关联的appenderB中配置了常规过滤器C,那么每当这个loggerA发起记录请求的时候都会调用这个常规过滤器C。但是未与appenderB关联的logger发起记录请求时无法调用这个常规过滤器C。

TurboFilter过滤器作用范围:整个Logger上下文。就是所有的logger发起记录请求时都会调用这个TurboFilter类型过滤器。

根据他们的作用范围不同,因此我们可以猜测出在配置文件中他们所处的位置肯定是不同的。

过滤器位置

常规过滤器Filter位置:位于appender内。常规过滤器用标签,是的子标签。

TurboFilter过滤器位置:位于configuration内。TurboFilter过滤器用标签,是子标签。

1.自定义TurboFilter过滤器

想要自定义TurboFilter过滤器,必须创建一个类,且该类必须继承TurboFilter抽象类并实现decide()方法。

下面我们通过示例来了解一下如何创建自定义TurboFilter过滤器。

创建并使用自定义TurboFilter过滤器步骤(2步):

1.创建继承TurboFilter抽象类的类SampleTurboFilter。

2.在xml配置文件中配置TurboFilter过滤器。

示例:

packagechapters.filters;importorg.slf4j.Marker;importorg.slf4j.MarkerFactory;importch.qos.logback.classic.Level;importch.qos.logback.classic.Logger;importch.qos.logback.classic.turbo.TurboFilter;importch.qos.logback.core.spi.FilterReply;public class SampleTurboFilter extendsTurboFilter {

String marker;

Marker markerToAccept;

@OverridepublicFilterReply decide(Marker marker, Logger logger, Level level,String format, Object[] params, Throwable t) {if (!isStarted()) {returnFilterReply.NEUTRAL;

}if((markerToAccept.equals(marker))) {returnFilterReply.ACCEPT;

}else{returnFilterReply.NEUTRAL;

}

}publicString getMarker() {returnmarker;

}public voidsetMarker(String markerStr) {this.marker =markerStr;

}

@Overridepublic voidstart() {if (marker != null && marker.trim().length() > 0) {

markerToAccept=MarkerFactory.getMarker(marker);super.start();

}

}

}

上面的 TurboFilter 接受包含特定 marker 的事件。如果上述 marker 未找到,则把任务交给过滤器链里的下一个过滤器。

9da279688d9c6b8cba9f9ffe0ef6f268.png

下面在配置文件中使用自定义的TurboFilter过滤器。 配置文件如下所示:

a2fdc7fd6c5ac8a9b7becd62eed3406a.png

3f14773753effd3a76bd33e794e43221.png

2.logback-classic中直接使用的TurboFilter过滤器

884b1f6d501fafa304c98a1b2935958c.png

logback-classic实现的TurboFilter过滤器(2种):MDCFilter、MarkerFilter。

1.MDCFilter过滤器介绍

MDCFilter 类检查在 MDC 里是否存在一个给定值,从而决定响应哪个值(ACCEPT 、NEUTRAL 、DENY)。

配置如下:

cd1518b2bb32dbaaa8b96108ada4eda5.png

acaca958ed4ef069955a5162ffa5d9c8.png

e5f943d2ca733e96955e0a246521eb24.png

注意:标签在标签外面。

2.MarkerFilter过滤器介绍

MarkerFilter会检查与记录事件相关联的某个特定marker是否存在,从而决定响应哪个值(ACCEPT 、NEUTRAL 、DENY)。

配置如下:

c49f8ee1ae6fecffd6ec3b838063f068.png

ff03698c3dd57c042835a914f734ae56.png

ad833b89165e953f8b277af5d09d4617.png

3.重复消息过滤器(DuplicateMessageFilter)

重复消息过滤器也是TurboFilter过滤器的一种。

cbdf0ded74fdcd8ed3ade4fa84042bcf.png

576b28888c7290fb80a3a6ee8c0c8e59.png

重复消息过滤器的配置如下:

6c09bd4600a58e4f854a70db4bfc48ac.png

2.logback-core模块中的过滤器

logback-core中只包含了求值过滤器,但是求值过滤器是一个抽象类。

求值过滤器也是有一个常规过滤器。

1.求值过滤器(EvaluatorFilter)

2defe8d50379ade6d4f69ef414b3768f.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值