我想配置log4j2.xml
的{{1}}元素的值。
名义上我们有这种模式:
<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>
元素可以specify the pattern using Environment Variables。例如:
<Pattern/>
我也知道it is possible to specify a default/fallback value,如此:<Pattern>%d %p %c{1.} [%t] $${env:USER} %m%n</Pattern>
。这很好,因为我希望标称模式是默认模式,并且无需指定定制环境即可工作。
所以,我尝试了这种模式:
$${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
我所描述的用例是否超出了log4j2字符串插值的限制?
显然,我可以改为使用环境变量来指向一个不同的${env:LOG_SYSOUT_PATTERN:-2016-09-27 10:47:29,642 INFO c.b.b.a.Engine [main] Sleeping AuditEngine for 1000 ms
}
文件,但我更倾向于一个不涉及维护和部署两个文件的解决方案,以便实现一个定制的差异。一个用户。
我们使用Log4j 2.5和SLF4J 1.7.16。
答案 0 :(得分:0)
模式中有错误 试试吧
<Pattern>$${env:LOG_SYSOUT_PATTERN}:-%d %p %c{1.} [%t] %m%xEx{filters(${filters})}%n</Pattern>