【发布时间】:2017-02-04 23:39:30
【问题描述】:
我想让我的log4j2.xml 的<Pattern/> 元素的值可配置。
名义上我们有这种模式:
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%xEx{filters(${filters})}%n</Pattern>
</PatternLayout>
</Console>
我们代码的一个用户想要一个不同的模式(他们有一个约束“日志条目不能跨越多行——即使他们有堆栈跟踪”),看起来像这样:
<Pattern>%replace{%d %p %c{1.} [%t] %m%xEx{filters(${filters})}}{(\n|\r)+}{, }%n</Pattern>
每个用户都可以独立指定自己的环境,所以我觉得这是让他们选择自己的模式的好方法。
我知道<Pattern/> 元素中的specify the pattern using Environment Variables 是可能的。例如:
<Pattern>%d %p %c{1.} [%t] $${env:USER} %m%n</Pattern>
我也知道it is possible to specify a default/fallback value,就像这样:$${env:USER:-default}。这很好,因为我希望名义模式成为默认模式,并且无需指定定制环境即可工作。
所以,我尝试了这种模式:
<Pattern>$${env:LOG_SYSOUT_PATTERN:-%d %p %c{1.} [%t] %m%xEx{filters(${filters})}%n}</Pattern>
我的理解是,它允许用户在 LOG_SYSOUT_PATTERN 中指定一个模式,否则回退到通常的模式。
我希望我的日志条目如下所示:
2016-09-27 10:47:32,073 INFO c.b.b.a.Engine [main] Sleeping AuditEngine for 1000 ms
但它似乎失败了。我的模式实际上是这样的:
${env:LOG_SYSOUT_PATTERN:-2016-09-27 10:47:29,642 INFO c.b.b.a.Engine [main] Sleeping AuditEngine for 1000 ms
}
我所描述的用例是否超出了log4j2的字符串插值的限制?
显然,我可以改用环境变量来完全指向不同的 log4j2.xml 文件,但我更喜欢不涉及维护和部署两个文件的解决方案,以便为一个用户定制一个差异.
我们使用 Log4j 2.5 和 SLF4J 1.7.16。
【问题讨论】:
-
这个问题在这里被跟踪issues.apache.org/jira/browse/LOG4J2-2968如果你有兴趣请投票。