看过logback配置语法(Configuration file syntax)的伙伴们,也许知道,logback配置文件里面是可以写 类似于jsp里面的el 表达式的,
比如
.... <property name="projectName" value="webapp-springmvc3"></property> .... <appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>D:\\logs\\feilong\\${projectName}\\log.log</File> ......... </appender>
像上面 ${projectName} 的写法, 在logback里面叫做 variables
有兴趣看手册的同学,可以看这里
http://logback.qos.ch/manual/configuration.html#variableSubstitution
那么logback是如何做到解析这样的variables的呢?以及logback 解析这些variables 使用的值有哪些呢?
真相只有一个,源码面前了无秘密
先参见,logback的启动以及加载配置文件
【飞天奔月出品】剖析logback之logback启动
【飞天奔月出品】logback1.1.13配置文件加载顺序
跟踪代码,发现解析变量是在 这里执行的
ch.qos.logback.core.subst.NodeToStringTransformer.lookupKey(String)
private String lookupKey(String key) { String value = propertyContainer0.getProperty(key); if (value != null) return value; if (propertyContainer1 != null) { value = propertyContainer1.getProperty(key); if (value != null) return value; } value = OptionHelper.getSystemProperty(key, null); if (value != null) return value; value = OptionHelper.getEnv(key); if (value != null) { return value; } return null; }
转成流程图
上面提到的 InterpretationContext 以及 LoggerContext ,涉及到logback variables scope,
参见:
http://logback.qos.ch/manual/configuration.html#scopes
此外 ch.qos.logback.core.util.OptionHelper 提供了logback核心工具类,
ch.qos.logback.core.util.OptionHelper.getEnv(String) 拿到系统环境变量
ch.qos.logback.core.util.OptionHelper.getSystemProperty(String) 拿到JVM属性
都在这个类里面里面进行的