我们正在从自定义日志(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
  },

但没有骰子.感谢任何人的帮助,谢谢你的寻找?

推荐答案

使用当前的JTL解析器集不可能做到这一点.虽然您可以创建自己的解析器并在那里呈现request字段.请参阅手册中的Extending Event Resolvers部分.在那里,您的EventResolver#resolve(LogEvent, JsonWriter)方法将可以访问事件本身和JSON写入的缓冲区.

根据记录,还有LOG4J2-3082个.在这里,我想启用Employee JsonWriter的定制.

Java相关问答推荐

Java 8中的多个字段和计数

为什么BasicComboBoxRenderer在文本不存在或文本为空的情况下设置两次文本?

S的字符串表示是双重精确的吗?

如何让JFileChooser(DIRECTORIES_ONLY)从FolderName中的空白开始?

使用传递的参数构造异常的Mockito-doThrow(或thenThrow)

在Java中,如何按一个属性升序,然后按另一个属性降序对对象列表进行排序?

解释左移在Java中的工作原理

如何使用Jackson将XML元素与值和属性一起封装

Docker不支持弹性APM服务器

使用正则表达式从字符串中提取多个值

在处理2个映射表时,没有更多的数据可从套接字读取

Java在操作多个属性和锁定锁对象时使用同步和易失性

从泛型枚举创建EnumMap

有没有办法在o(log(N))中以系统的方式将数组中的小块元素复制和移动到新增长的数组中的左侧?

RestTemplate Bean提供OkHttp3ClientHttpRequestFactory不支持Spring Boot 3中的请求正文缓冲

Java类型推断:为什么要编译它?

具有多个分析模式的复杂分隔字符串的正则表达式

如何在Spring Boot Auth服务器上正确配置CORS?

PhantomReference无法访问时会发生什么?

将Optionals/null安全添加到嵌套的flatMap/流