当某些日志属性基于添加到threadcontext的数据时,如何避免在log4j2中打印“contextMap”

问题描述 投票:0回答:1

我想以 log4j2 Json 格式记录 2 个自定义字段,其中一个具有固定值,另一个来自 ThreadContext。我正在使用 JsonTemplateLayout 来打印日志属性。在这里,从 ThreadContext 派生其值的属性被打印两次。一旦处于记录 JSON 输出的根级别,并且位于“contextMap”键下。默认情况下,log4j2 添加此“contextMap”键。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
   <Appenders>
      <Console name="console" target="SYSTEM_OUT">
          <JsonTemplateLayout eventTemplateUri="classpath:JsonLayout.json">
              <EventTemplateAdditionalField key="myApp" value="MYAPPLICATION" />
             
              <EventTemplateAdditionalField key="customKey1"
                              format="JSON"
                              value='{"$resolver": "mdc", "key": "customKey1"}'/>  
                        
          </JsonTemplateLayout>
      </Console>
   </Appenders>
    <Loggers>
        <Root level="info" additivity="false">
            <AppenderRef ref="console" />
        </Root>
    </Loggers>
</Configuration>

我的输出如下:

{
    "instant": {
        "epochSecond": 1712749405,
        "nanoOfSecond": 600717045
    },
    "thread": "t1",
    "level": "ERROR",
    "loggerName": "com.example.myapp.Log",
    "message": "custom log msg",
    "contextMap": {
        "customKey1": "customValue"
    },
    "myApp": "MYAPPLICATION",
    "customKey1": "customValue"
}

如何抑制log4j2中“contextMap”属性的打印?

版本信息:

"org.springframework.boot:spring-boot-starter-log4j2:2.7.18"
"org.apache.logging.log4j:log4j-layout-template-json:2.21.1"

log4j2
1个回答
1
投票

你可以

  1. 提供您自己的自定义事件模板布局(将
    JsonLayout.json
    复制到类路径中的
    MyLayout.json
    ,根据您的喜好进行编辑,然后在
    eventTemplateUri
    属性中指向它)
  2. 或将
    contextMap
    条目覆盖为空:
    <EventTemplateAdditionalField key="contextMap" format="JSON" value='null'/>

注意:我强烈建议您不要使用

JsonLayout.json
模板。它用于提供从已弃用的 JSON 布局的迁移路径。使用
EcsLayout.json
(默认)或使用
stringified
异常解析器创建您自己的自定义解析器。

© www.soinside.com 2019 - 2024. All rights reserved.