【发布时间】:2020-09-06 13:08:01
【问题描述】:
我们可以定义一个 appender 并通过 AppenderRef 引用它来为多个记录器设置它。
那么是否有可能拥有一个全局 Layout 并在我们想要的任何附加程序中引用它?
就像Appender 中的AppenderRef 一样,我们可以在Layout 中使用LayoutRef 吗?
类似这样的:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Properties>
<Property name="env">dev</Property>
<Property name="app">MyApp</Property>
<Property name="module">MyModule</Property>
<Lots Of Other Properties/>
</Properties>
<Layouts>
<JsonLayout name="MyJsonLayout" complete="false" compact="false">
<KeyValuePair key="myKey" value="myValue" />
<KeyValuePair key="app" value="${app}"/>
<KeyValuePair key="module" value="${module}"/>
<KeyValuePair key="env" value="${env}"/>
<Lots Of Other reference to properties/>
</JsonLayout>
</Layouts>
<Appenders>
<Console name="consoleJson" target="SYSTEM_OUT">
<LayoutRef ref="MyJsonLayout"/>
</Console>
<Kafka name="kafkaJson" topic="myTopic">
<LayoutRef ref="MyJsonLayout"/>
</Console>
</Appenders>
<Loggers>
<Logger name="class1" level="debug">
<AppenderRef ref="kafkaJson"/>
</Logger>
<Logger name="class2" level="debug">
<AppenderRef ref="kafkaJson"/>
</Logger>
<Root level="error">
<AppenderRef ref="consoleJson"/>
</Root>
</Loggers>
为什么我需要这个?
我在 log4j2.xml 配置文件的开头设置了某些属性,我在 JsonLayout 中使用这些属性,您可以看到它们被命名为 app、module 等。通过定义一个全局布局,我将有幸只编辑Properties 部分。否则,我需要在所有附加程序中进行更改,因为它们将有自己的布局,并且布局的所有属性都是相同的。必须将相同的布局写入不同的 appender 是低效的。
【问题讨论】:
标签: log4j2