我使用slf 4j和log4j 2作为实现。我希望我的消息(在JSON中)被记录为JSON,而不是作为字符串进行转义。
查看org.apache.logging.log4j.layout.template.json.resolver.MessageResolver
类,我发现如果我删除模板(JsonTemplateLayout
)中的stringified
标记,它应该可以工作,但它不工作。
在调试代码时,我可以看到我的Message是一个MutableLogEvent
(而不是MultiformatMessage
或ObjectMessage
),因此MessageResolver
回退到一个缺省的日志记录,它会转义引号。
我不确定log4j是如何确定要使用的消息类型的,或者我是否需要以不同的方式记录,或者配置一些特殊的东西来获得这个消息。
添加一些上下文:我是Powertools for AWS Lambda(Java)的作者之一,我们在SLF 4J之上提供了一个日志库(+log4j/logback implem)。目标是让开发人员简单地记录日志,我们处理格式化并向日志添加一些上下文数据。我们希望为开发人员保持精简和简单。
2条答案
按热度按时间e4eetjau1#
我使用自己的解析器解决了这个问题,检查字符串是否是有效的json(使用Jackson
readTree
函数),然后编写原始字符串(不带“)或使用标准字符串。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功能。