You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 05:06:06