我们正在从自定义日志(log)记录框架迁移到Log4j2,并try 尽可能匹配输出对等.
我们目前有一个通过Map接受多个参数的LOG语句,所有这些属性都被写入到我们的定制JSON日志(log)记录输出的根目录中.我们记录的大多数映射属性都是原语/字符串,但是有一个属性是JsonElement
(Gson),表示 struct 化的Web请求内容.在我们的遗留定制日志(log)框架中,它被编写为将这JsonElement
作为嵌套JSON对象移植到日志(log)输出中,因此:
"request":{
"visitId":"ABCDEFG"
},
要try 在Log4j2中复制所有这些功能,我使用JsonTemplateLayout
和类似这样的解析器将所有map(StringMapMessage
)属性展平到JSON根:
"mapMessage": {
"$resolver": "map",
"flatten": true
},
为了填充Log4j2事件,我真正要做的就是遍历Map,并用与前面相同的内容构建一个StringMapMessage
.
这似乎给了我们大部分我们正在寻找的东西,除了处理JsonElement
.Log4j2大概(也是可以理解的)就是toString()‘S的JsonElement
.所以我们最后得到:
"request":"{\"visitId\":\"ABCDEFG\"}",
虽然我不喜欢以这种方式将这JsonElement
传递给Log4j2,但基于我们在代码中记录的位置以及这个JsonElement对象可以表示我们系统中各种不同的Java支持的请求对象的事实,我并没有看到太多的选项.
Question: Is there a way for some behavior in the 100 to deserialize the JSON string from this map field back into structured JSON? Or is there a different way I should be formatting my logging event to achieve this?
我试过以下几种方法:
在log4j2.xml中:
<EventTemplateAdditionalField
key="request"
format="JSON"
value='{"$resolver": "map", "field": "request"}'/>/>
在我们的模板中:
"request": {
"$resolver": "map",
"key": "request",
"format": "JSON",
"stringified": false
},
但没有骰子.感谢任何人的帮助,谢谢你的寻找?