java Log4j2:是否可以将map消息值中的JSON字符串转换为事件输出中的结构化JSON?

q3qa4bjr  于 2023-08-01  发布在  Java
关注(0)|答案(1)|浏览(85)

我们正在从自定义日志框架迁移到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
  },


但没有骰子。感谢任何和所有的帮助,感谢您的期待?

hmae6n7t

hmae6n7t1#

使用当前的JTL解析器集,这是不可能的。不过,您可以创建自己的解析器并在那里呈现request字段。请参阅手册中的“扩展事件解决程序”部分。在那里,您的EventResolver#resolve(LogEvent, JsonWriter)方法将可以访问事件本身和写入JSON的缓冲区。
对于记录,还有LOG4J2-3082。在那里,我想启用所使用的JsonWriter的自定义。

相关问题