我想以 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"
你可以
JsonLayout.json
复制到类路径中的 MyLayout.json
,根据您的喜好进行编辑,然后在 eventTemplateUri
属性中指向它)contextMap
条目覆盖为空:<EventTemplateAdditionalField key="contextMap" format="JSON" value='null'/>
注意:我强烈建议您不要使用
JsonLayout.json
模板。它用于提供从已弃用的 JSON 布局的迁移路径。使用 EcsLayout.json
(默认)或使用 stringified
异常解析器创建您自己的自定义解析器。