slf4j和log4j2 json消息已转义

lztngnrs  于 4个月前  发布在  其他
关注(0)|答案(2)|浏览(45)

我使用slf 4j和log4j 2作为实现。我希望我的消息(在JSON中)被记录为JSON,而不是作为字符串进行转义。
查看org.apache.logging.log4j.layout.template.json.resolver.MessageResolver类,我发现如果我删除模板(JsonTemplateLayout)中的stringified标记,它应该可以工作,但它不工作。
在调试代码时,我可以看到我的Message是一个MutableLogEvent(而不是MultiformatMessageObjectMessage),因此MessageResolver回退到一个缺省的日志记录,它会转义引号。
我不确定log4j是如何确定要使用的消息类型的,或者我是否需要以不同的方式记录,或者配置一些特殊的东西来获得这个消息。
添加一些上下文:我是Powertools for AWS Lambda(Java)的作者之一,我们在SLF 4J之上提供了一个日志库(+log4j/logback implem)。目标是让开发人员简单地记录日志,我们处理格式化并向日志添加一些上下文数据。我们希望为开发人员保持精简和简单。

e4eetjau

e4eetjau1#

我使用自己的解析器解决了这个问题,检查字符串是否是有效的json(使用JacksonreadTree函数),然后编写原始字符串(不带“)或使用标准字符串。

dpiehjr4

dpiehjr42#

您正在使用SLF4J作为日志记录API,与Log4j Core的本机API相比,它的限制性更强:Log4j API。
特别是SLF4J不允许将Object记录为消息,你能做的最好的事情就是传递一个格式String和一个Object参数列表。这就是为什么SLF4J到Log4j API适配器只创建两种消息:某种ParameterizeMessage或某种SimpleMessage
为了将对象传递给Log4j API,而不将其字符串化,您必须直接使用API。

备注:由于Log4j API几乎是SLF4J的严格超集(#1813中讨论了一些例外),因此如果使用Log4j API + Logback组合,则不会丢失任何Logback功能。

相关问题