【问题标题】:How to define a global Layout for log4j2?如何为 log4j2 定义全局布局?
【发布时间】: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 中使用这些属性,您可以看到它们被命名为 appmodule 等。通过定义一个全局布局,我将有幸只编辑Properties 部分。否则,我需要在所有附加程序中进行更改,因为它们将有自己的布局,并且布局的所有属性都是相同的。必须将相同的布局写入不同的 appender 是低效的。

【问题讨论】:

    标签: log4j2


    【解决方案1】:

    据我所知,从这里查看 XSD master branch of the Log4j-config.xsd

    没有这样的东西。我想错了,因为我自己需要它。

    所以如果可能的话,它不在架构中。

    您是否向开发人员提出过问题?如果是,请发布一个链接,我也会投票赞成它。

    另一个相关问题在这里13904481

    【讨论】:

      猜你喜欢
      • 2014-01-25
      • 2017-10-15
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 2016-01-05
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多