Log4j2路由追加器的Route-key应使用$$还是$处理未解析表达式?
Log4j2 Routing Appender 路由配置疑问
官方文档警告
Route组件的子元素中的查找不会在配置时计算,替换会延迟到Route元素被计算时进行。这意味着
${...}表达式不应转义为$${...}。
两个表现一致的配置
配置1
<Routing name="[...]"> <Routes pattern="$${ctx:foo}"> <Route key="true" ref="RollingFileFoo" /> <Route key="$${ctx:foo}" ref="RollingFile" /> </Routes> </Routing>
配置2
<Routing name="[...]"> <Routes pattern="$${ctx:foo}"> <Route key="true" ref="RollingFileFoo" /> <Route key="${ctx:foo}" ref="RollingFile" /> </Routes> </Routing>
理解与核心疑问
- 我认为
pattern中的表达式会在配置时被插值,因此必须用$$转义,这样运行时pattern实际值为${ctx:foo},会针对每条经过追加器的日志语句实时计算。 - 当表达式找不到指定的
foo键时,pattern的结果会保留表达式本身,这时需要设置对应表达式值的key来匹配。但这里产生疑问:此时匹配的key应该用配置时的$$形式,还是运行时的$形式? - 两个配置表现完全一致,但根据源码中的
equals比较逻辑,这不该发生:
public Route getRoute(final String key) { for (final Route route : routes) { if (Objects.equals(route.getKey(), key)) { return route; } } return null; }
- 我的困惑点:如果
pattern用$$转义是必要的(避免配置时解析,保留到运行时),而key在配置时完全不解析、直接按原字符串使用,那么用$${ctx:foo}作为key应该匹配失败才对,因为运行时实际的匹配值是${ctx:foo}。
内容的提问来源于stack exchange,提问作者Thorsten Schöning
相关产品推荐
相关产品推荐

