我们正在从自定义日志框架迁移到 Log4j2,并尝试尽可能匹配输出奇偶校验。
我们目前有一个日志语句,它通过 Map 接受多个参数,并且所有这些属性都写入我们的自定义 JSON 日志输出的根目录。我们记录的大多数地图属性都是基元/字符串,但有一个属性是
JsonElement
(Gson),代表结构化 Web 请求内容。在我们的旧版自定义日志记录框架中,它的编写方式是使该 JsonElement
作为嵌套 JSON 对象嫁接到日志输出中,因此:
"request":{
"visitId":"ABCDEFG"
},
为了尝试在 Log4j2 中复制所有这些功能,我使用 JsonTemplateLayout 和解析器来将所有映射 (
StringMapMessage
) 属性展平到 JSON 根:
"mapMessage": {
"$resolver": "map",
"flatten": true
},
我真正要做的填充 Log4j2 事件就是迭代 Map 并构建一个与之前内容相同的
StringMapMessage
。
这似乎为我们提供了我们正在寻找的大部分内容,除了处理
JsonElement
之外。 Log4j2 大概(并且可以理解)只是 toString() 的 JsonElement
。所以我们最终得到:
"request":"{\"visitId\":\"ABCDEFG\"}",
虽然我不喜欢像这样将这个
JsonElement
传递给Log4j2,但根据我们正在记录的代码中的位置以及这个JsonElement对象可以代表各种不同的Java这一事实,我并没有真正看到太多选项 -我们系统中支持 Request 对象。
问题:
JsonTemplateLayout
中的某些行为是否可以将 JSON 字符串从该映射字段反序列化回结构化 JSON?或者我应该采用不同的方式来格式化我的日志记录事件来实现此目的?
我尝试过以下方法:
在 log4j2.xml 中:
<EventTemplateAdditionalField
key="request"
format="JSON"
value='{"$resolver": "map", "field": "request"}'/>/>
在我们的模板中:
"request": {
"$resolver": "map",
"key": "request",
"format": "JSON",
"stringified": false
},
但是没有骰子。感谢所有帮助,感谢您的关注?