【问题标题】:Log4j2: Change Pattern based on environment variableLog4j2:基于环境变量的更改模式
【发布时间】: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>

每个用户都可以独立指定自己的环境,所以我觉得这是让他们选择自己的模式的好方法。

我知道&lt;Pattern/&gt; 元素中的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。

【问题讨论】:

标签: java log4j2


【解决方案1】:

您的模式有误 试试看

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

【讨论】:

  • 我认为这个断言是不正确的。正如我在问题中所解释的,我们已经知道带有后备值的宏扩展的语法是:$${env:USER:-default},但您的建议是将后备移出括号。那肯定是无效的。事实上,我已经尝试过运行您的 Pattern。它将:- 解释为文字。奇怪的是,未定义的宏根本没有扩展,而是按字面意思打印:${env:LOG_SYSOUT_PATTERN}:-2016-09-27 14:45:59,425 INFO c.b.b.a.Engine [main] Sleeping AuditEngine for 1000 ms
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-15
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多