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

聊聊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来决定是否打印日志。


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

相关文章:

  • LinuxCentos中安装apache网站服务详细教程
  • 项目技术栈-解决方案-web3去中心化
  • 利用编程语言和脚本编写技术,实现自动化渗透测试和安全工具的开发
  • 手动实现promise的all,race,finally方法
  • 微服务各组件整合
  • HTTP 客户端怎么向 Spring Cloud Sleuth 传输跟踪 ID
  • Java编程技巧:将图片导出成pdf文件
  • Linux | 信号
  • 【done】剑指offer68:二叉树最近公共祖先
  • IDEA远程一键部署SpringBoot到Docker
  • OpenAI GPT5计划泄露
  • 解析:什么是生成式AI?与其他类型的AI有何不同?
  • hyperledger fabric2.4测试网络添加组织数量
  • PL/SQL编程
  • QT多线程项目中子线程无法修改主线程的ui组件
  • Windows 下 Sublime Text 3.2.2 下载及配置
  • Object常用方法——toString()
  • Linux - 进一步理解 文件系统 - inode - 机械硬盘
  • C语言程序设计(入门)
  • py 字符串转INT
  • PS 颜色取样器标尺工具 基本使用讲解
  • Linux中的进程终止(详解)
  • Pandas数据操作_Python数据分析与可视化
  • Python学习(一)基础语法
  • 11. Spring源码篇之实例化前的后置处理器
  • ElasticSearch综合练习题,ES为8版本,使用Kibana运行语句