我们正在从自定义日志框架迁移到Log4j 2,并尝试尽可能匹配输出奇偶校验。
我们目前有一个通过Map接受多个参数的log语句,所有这些属性都被写入我们的自定义JSON日志输出的根。我们记录的大多数map属性都是原语/字符串,但是有一个属性是JsonElement
(Gson),它表示结构化的Web请求内容。在我们的传统自定义日志框架中,它被编写为将JsonElement
作为嵌套JSON对象移植到日志输出中,因此:
"request":{
"visitId":"ABCDEFG"
},
字符串
为了尝试在Log4j 2中复制所有这些功能,我使用JsonTemplateLayout
和一个解析器来将所有map(StringMapMessage
)属性扁平化到JSON根:
"mapMessage": {
"$resolver": "map",
"flatten": true
},
型
为了填充Log4j 2事件,我所做的就是遍历Map并构建一个StringMapMessage
,其中包含与以前相同的内容。
这似乎给予了我们大部分我们正在寻找的东西,除了处理JsonElement
。Log4j 2大概(可以理解)只是toString()的JsonElement
。最后我们得到:
"request":"{\"visitId\":\"ABCDEFG\"}",
型
虽然我不喜欢像这样将这个JsonElement
传递给Log4j 2,但根据我们在代码中记录的位置以及这个JsonElement对象可以表示我们系统中各种不同的Java支持的Request对象的事实,我真的看不到太多的选择。
问题:JsonTemplateLayout
中的某些行为是否有方法将此map字段中的JSON字符串反序列化为结构化JSON?或者有没有其他的方式来格式化我的日志事件来实现这一点?
我尝试过以下方法:
在log4j2.xml中:
<EventTemplateAdditionalField
key="request"
format="JSON"
value='{"$resolver": "map", "field": "request"}'/>/>
型
在我们模板中:
"request": {
"$resolver": "map",
"key": "request",
"format": "JSON",
"stringified": false
},
型
但没有骰子。感谢任何和所有的帮助,感谢您的期待?
1条答案
按热度按时间hmae6n7t1#
使用当前的JTL解析器集,这是不可能的。不过,您可以创建自己的解析器并在那里呈现
request
字段。请参阅手册中的“扩展事件解决程序”部分。在那里,您的EventResolver#resolve(LogEvent, JsonWriter)
方法将可以访问事件本身和写入JSON的缓冲区。对于记录,还有LOG4J2-3082。在那里,我想启用所使用的
JsonWriter
的自定义。