logback使用MDCFilter日志过滤源码解读

 更新时间:2023年11月15日 10:19:24   作者:codecraft  
这篇文章主要介绍了logback使用MDCFilter日志过滤源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

本文主要研究一下logback的MDCFilter

MatchingFilter

ch/qos/logback/classic/turbo/MatchingFilter.java

public abstract class MatchingFilter extends TurboFilter {
    protected FilterReply onMatch = FilterReply.NEUTRAL;
    protected FilterReply onMismatch = FilterReply.NEUTRAL;
    final public void setOnMatch(String action) {
        if ("NEUTRAL".equals(action)) {
            onMatch = FilterReply.NEUTRAL;
        } else if ("ACCEPT".equals(action)) {
            onMatch = FilterReply.ACCEPT;
        } else if ("DENY".equals(action)) {
            onMatch = FilterReply.DENY;
        }
    }
    final public void setOnMismatch(String action) {
        if ("NEUTRAL".equals(action)) {
            onMismatch = FilterReply.NEUTRAL;
        } else if ("ACCEPT".equals(action)) {
            onMismatch = FilterReply.ACCEPT;
        } else if ("DENY".equals(action)) {
            onMismatch = FilterReply.DENY;
        }
    }
}
MatchingFilter继承了TurboFilter,它提供了setOnMatch及setOnMismatch方法,它们在action为NEUTRAL、ACCEPT、DENY时设置对应的onMatch、onMismatch

MDCFilter

ch/qos/logback/classic/turbo/MDCFilter.java

public class MDCFilter extends MatchingFilter {
    String MDCKey;
    String value;
    @Override
    public void start() {
        int errorCount = 0;
        if (value == null) {
            addError("\'value\' parameter is mandatory. Cannot start.");
            errorCount++;
        }
        if (MDCKey == null) {
            addError("\'MDCKey\' parameter is mandatory. Cannot start.");
            errorCount++;
        }
        if (errorCount == 0)
            this.start = true;
    }
    @Override
    public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) {
        if (!isStarted()) {
            return FilterReply.NEUTRAL;
        }
        String value = MDC.get(MDCKey);
        if (this.value.equals(value)) {
            return onMatch;
        }
        return onMismatch;
    }
    public void setValue(String value) {
        this.value = value;
    }
    public void setMDCKey(String MDCKey) {
        this.MDCKey = MDCKey;
    }
}
MDCFilter继承了MatchingFilter,其start方法校验MDCKey及value属性是否有值,其decide方法跟从MDC获取指定key的值,然后判断该值域value是否相等,相等则返回onMatch,否则返回onMismatch

示例

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
  <turboFilter class="ch.qos.logback.classic.turbo.MDCFilter">
    <MDCKey>username</MDCKey>
    <Value>sebastien</Value>
    <OnMatch>ACCEPT</OnMatch>
  </turboFilter>
  <turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
    <Marker>billing</Marker>
    <OnMatch>DENY</OnMatch>
  </turboFilter>
  <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>%date [%thread] %-5level %logger - %msg%n</Pattern>
    </layout>
  </appender>
  <root level="info">
    <appender-ref ref="console" />
  </root>
</configuration>

小结

logback提供了MDCFilter,它可以根据指定的MDCKey从MDC取值,然后根据配置的value进行判断,然后执行onMatch或者onMismatch来决定是否打印日志。

以上就是logback使用MDCFilter日志过滤源码解读的详细内容,更多关于logback MDCFilter日志过滤的资料请关注脚本之家其它相关文章!

相关文章

  • Java synchronized偏向锁的概念与使用

    Java synchronized偏向锁的概念与使用

    因为在我们写的程序当中可能会经常使用到synchronized关键字,因此JVM对synchronized做出了很多优化,而在本篇文章当中我们将仔细介绍JVM对synchronized的偏向锁的细节
    2023-02-02
  • java中Hibernate的状态总结

    java中Hibernate的状态总结

    在本篇内容里小编给大家整理的是一篇关于java中Hibernate的状态总结内容,有兴趣的朋友们可以学习下。
    2021-01-01
  • SpringSecurity实现登陆认证并返回token方式

    SpringSecurity实现登陆认证并返回token方式

    这篇文章主要介绍了SpringSecurity实现登陆认证并返回token方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Spring中的循环依赖问题

    Spring中的循环依赖问题

    在Spring框架中,循环依赖是指两个或多个Bean相互依赖,这导致在Bean的创建过程中出现依赖死锁,为了解决这一问题,Spring引入了三级缓存机制,包括singletonObjects、earlySingletonObjects和singletonFactories
    2024-09-09
  • Java某个经纬度是否在genjson文件中问题

    Java某个经纬度是否在genjson文件中问题

    GeoJSON是一种用于地理空间信息数据交换的格式,基于JSON,要判断某个经纬度是否在某个区域内,首先需要解析GeoJSON文件,确定区域边界,然后使用经纬度进行比较
    2024-11-11
  • MyBatis使用resultMap如何解决列名和属性名不一致

    MyBatis使用resultMap如何解决列名和属性名不一致

    这篇文章主要介绍了MyBatis使用resultMap如何解决列名和属性名不一致的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java使用JavaMail发送邮件的方法

    Java使用JavaMail发送邮件的方法

    这篇文章主要介绍了Java使用JavaMail发送邮件的方法,结合实例形式分析了Java使用JavaMail实现邮件发送的具体步骤与相关实现代码,需要的朋友可以参考下
    2016-04-04
  • 更改eclipse的JDK版本详细步骤

    更改eclipse的JDK版本详细步骤

    我们用eclipse在做项目的时候会切换jdk版本,本地运行的项目所使用的jdk版本比Linux服务器高(低),需要调低(高)JDK版本,这篇文章主要给大家介绍了关于如何更改eclipse的JDK版本的相关资料,需要的朋友可以参考下
    2023-11-11
  • 浅析JAVA中toString方法的作用

    浅析JAVA中toString方法的作用

    以下是对在JAVA中toString方法的作用进行了详细的分析介绍,需要的朋友可以参考下
    2013-07-07
  • Spring Boot jar可执行原理的彻底分析

    Spring Boot jar可执行原理的彻底分析

    这篇文章主要给大家介绍了关于Spring Boot jar可执行原理的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07

最新评论