logback的UNDEFINED_PROPERTY属性源码执行流程解读

 更新时间:2023年11月07日 10:00:37   作者:codecraft  
这篇文章主要为大家介绍了logback的UNDEFINED_PROPERTY属性源码执行流程解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

本文主要研究一下logback的UNDEFINED_PROPERTY

substVars

ch/qos/logback/core/util/OptionHelper.java

public static String substVars(String input, PropertyContainer pc0, PropertyContainer pc1) {
        try {
            return NodeToStringTransformer.substituteVariable(input, pc0, pc1);
        } catch (ScanException e) {
            throw new IllegalArgumentException("Failed to parse input [" + input + "]", e);
        }
    }
OptionHelper提供了substVars方法,它执行NodeToStringTransformer的substituteVariable方法

substituteVariable

ch/qos/logback/core/subst/NodeToStringTransformer.java

public static String substituteVariable(String input, PropertyContainer pc0, PropertyContainer pc1) throws ScanException {
        Node node = tokenizeAndParseString(input);
        NodeToStringTransformer nodeToStringTransformer = new NodeToStringTransformer(node, pc0, pc1);
        return nodeToStringTransformer.transform();
    }
substituteVariable方法则先根据input解析node,再创建NodeToStringTransformer,执行其transform方法

transform

ch/qos/logback/core/subst/NodeToStringTransformer.java

public String transform() throws ScanException {
        StringBuilder stringBuilder = new StringBuilder();
        compileNode(node, stringBuilder, new Stack<Node>());
        return stringBuilder.toString();
    }
transform方法主要是执行compileNode,通过stringBuilder来收集变量值

compileNode

ch/qos/logback/core/subst/NodeToStringTransformer.java

private void compileNode(Node inputNode, StringBuilder stringBuilder, Stack<Node> cycleCheckStack) throws ScanException {
        Node n = inputNode;
        while (n != null) {
            switch (n.type) {
            case LITERAL:
                handleLiteral(n, stringBuilder);
                break;
            case VARIABLE:
                handleVariable(n, stringBuilder, cycleCheckStack);
                break;
            }
            n = n.next;
        }
    }
compileNode方法针对VARIABLE类型的执行handleVariable方法

handleVariable

ch/qos/logback/core/subst/NodeToStringTransformer.java

private void handleVariable(Node n, StringBuilder stringBuilder, Stack<Node> cycleCheckStack) throws ScanException {
        // Check for recursion
        if (haveVisitedNodeAlready(n, cycleCheckStack)) {
            cycleCheckStack.push(n);
            String error = constructRecursionErrorMessage(cycleCheckStack);
            throw new IllegalArgumentException(error);
        }
        cycleCheckStack.push(n);
        StringBuilder keyBuffer = new StringBuilder();
        Node payload = (Node) n.payload;
        compileNode(payload, keyBuffer, cycleCheckStack);
        String key = keyBuffer.toString();
        String value = lookupKey(key);
        // empty values are considered valid
        if (value != null) {
            Node innerNode = tokenizeAndParseString(value);
            compileNode(innerNode, stringBuilder, cycleCheckStack);
            cycleCheckStack.pop();
            return;
        }
        // empty default literal is a valid value
        if (n.defaultPart == null) {
            stringBuilder.append(key + CoreConstants.UNDEFINED_PROPERTY_SUFFIX);
            cycleCheckStack.pop();
            return;
        }
        Node defaultPart = (Node) n.defaultPart;
        StringBuilder defaultPartBuffer = new StringBuilder();
        compileNode(defaultPart, defaultPartBuffer, cycleCheckStack);
        cycleCheckStack.pop();
        String defaultVal = defaultPartBuffer.toString();
        stringBuilder.append(defaultVal);
    }

 handleVariable方法对于value为null,且defaultValue也为null的设置了默认值为key + CoreConstants.UNDEFINED_PROPERTY_SUFFIX)

UNDEFINED_PROPERTY_SUFFIX

public class CoreConstants {
    //......
    public static final String UNDEFINED_PROPERTY_SUFFIX = "_IS_UNDEFINED";
}
UNDEFINED_PROPERTY_SUFFIX的值为_IS_UNDEFINED

小结

logback通过NodeToStringTransformer的handleVariable来获取变量值,若该value为null,且defaultValue也为null的设置了默认值为key + CoreConstants.UNDEFINED_PROPERTY_SUFFIX),即key_IS_UNDEFINED,注意这里如果defaultValue不为null则不走IS_UNDEFINED的逻辑,即空字符串也是可以的。对于自定义appender需要注意一下appender属性的value处理逻辑。

以上就是logback的UNDEFINED_PROPERTY属性源码执行流程解读的详细内容,更多关于logback UNDEFINED_PROPERTY的资料请关注脚本之家其它相关文章!

相关文章

  • Java使用Cipher类实现加密的过程详解

    Java使用Cipher类实现加密的过程详解

    这篇文章主要介绍了Java使用Cipher类实现加密的过程详解,Cipher类提供了加密和解密的功能,创建密匙主要使用SecretKeySpec、KeyGenerator和KeyPairGenerator三个类来创建密匙。感兴趣可以了解一下
    2020-07-07
  • java拷贝指定目录下所有内容到minIO代码实例

    java拷贝指定目录下所有内容到minIO代码实例

    这篇文章主要介绍了java拷贝指定目录下所有内容到minIO代码实例,创建桶 直接使用工具类先判断,再创建即可,创建文件夹,需要注意以"/"结尾,实际也是在minIO上创建文件,只是作为目录的表现形式展示,需要的朋友可以参考下
    2024-01-01
  • Java 8日期处理LocalDateTime时区转换的3大误区与解决方案

    Java 8日期处理LocalDateTime时区转换的3大误区与解决方案

    文章介绍了Java 8中的日期时间API,包括`LocalDateTime`、`ZonedDateTime`和`Instant`等核心类,以及它们在不同场景下的应用,文章还探讨了常见误区,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • java 中归并排序算法详解

    java 中归并排序算法详解

    这篇文章主要介绍了java 中归并排序算法详解的相关资料,归并排序算法又称为合并排序算法,是一种时间复杂度为O(N logN)的排序算法,因而其在平常生活工作中应用非常广泛,需要的朋友可以参考下
    2017-09-09
  • 浅谈Maven 项目中依赖的搜索顺序

    浅谈Maven 项目中依赖的搜索顺序

    这篇文章主要介绍了浅谈Maven 项目中依赖的搜索顺序,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • java生成验证码图片的方法

    java生成验证码图片的方法

    这篇文章主要为大家详细介绍了java生成验证码图片的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-02-02
  • Java中List.sort()自定义排序规则几种方式

    Java中List.sort()自定义排序规则几种方式

    Java中可通过Comparator匿名类、Lambda表达式、静态方法、自定义对象及实现Comparable接口实现List排序,这篇文章主要介绍了Java中List.sort()自定义排序规则几种方式,需要的朋友可以参考下
    2025-06-06
  • Java中常见的查找算法与排序算法总结

    Java中常见的查找算法与排序算法总结

    数据结构是数据存储的方式,算法是数据计算的方式。所以在开发中,算法和数据结构息息相关。本文为大家整理了Java中常见的查找与排序算法的实现,需要的可以参考一下
    2023-03-03
  • Java中SpringBoot的TCC事务详解

    Java中SpringBoot的TCC事务详解

    这篇文章主要介绍了Java中SpringBoot的TCC事务详解,近年来,随着微服务架构的普及,TCC 事务成为了一种非常流行的分布式事务解决方案,在 Spring Boot 中,我们可以很容易地使用 TCC 事务来管理分布式事务,需要的朋友可以参考下
    2023-07-07
  • Springboot之restTemplate配置及使用方式

    Springboot之restTemplate配置及使用方式

    这篇文章主要介绍了Springboot之restTemplate配置及使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04

最新评论