• 聊聊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;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    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;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    MDCFilter继承了MatchingFilter,其start方法校验MDCKey及value属性是否有值,其decide方法跟从MDC获取指定key的值,然后判断该值域value是否相等,相等则返回onMatch,否则返回onMismatch

    示例

    
    
    
    
      
        username
        sebastien
        ACCEPT
      
    
      
        billing
        DENY
      
    
      
        
          %date [%thread] %-5level %logger - %msg%n
        
      
    
      
        
      
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    小结

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

  • 相关阅读:
    MySQL数据库:开源且强大的关系型数据库管理系统
    Java 8 Stream API可以怎么玩?
    僵尸进程和孤儿进程
    2022-12-6-Cmake工程转VS环境开发
    SaaS企业如何构建与自身增长相匹配的渠道力
    Mybatis和MybatisPlus:数据库操作工具的对比
    Android设置应用图标
    趣解设计模式之《办理入职这么难吗?》
    SQL练习---619.出现一次的最大数字
    redis常见面试题(背诵篇)
  • 原文地址:https://blog.csdn.net/hello_ejb3/article/details/134412004