Log4j2:基于环境变量

时间:2016-09-27 11:01:55

标签: java log4j2

我想配置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。

1 个答案:

答案 0 :(得分:0)

模式中有错误 试试吧

<Pattern>$${env:LOG_SYSOUT_PATTERN}:-%d %p %c{1.} [%t] %m%xEx{filters(${filters})}%n</Pattern>