我正在尝试创建自定义日志格式,因为我的应用程序正在运行 Wildfly,并且我已将其迁移到 SpringBoot。在 Wildfly 上,应用程序日志已经采用 JSON 格式,但如果我使用像上面示例这样的简单模式,我会丢失来自 SpringBoot 的重要消息,错误和输出是混合纯字符串和 json 的混乱:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
我的应用程序代码很简单,当尝试记录它时基本上是:
MyLogObject log = ...
logger.info(log);
On
MyLogObject
使用 Jackson 覆盖了 toString() 以返回格式化的 JSON。
基于此,我将其更改为使用
net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder
和自定义模式:
<pattern>
{
"timestamp": "%date{ISO8601}",
"level": "%level",
"thread": "%t",
"message": "#tryJson{%message}"
}
</pattern>
它几乎解决了我的问题,但现在我觉得我错过了一些未处理的异常,并且消息混合了字符串和嵌套的 JSON。
现在我正在编写一个扩展
AbstractFieldJsonProvider
的类,它看起来可以解决我所有的问题,但我觉得这是不对的,因为我正在检查消息是否以 {
开头,然后我将其转换回我的 MyLogObject
并开始写入字段:
generator.writeStringField("_logType", "MyApp");
generator.writeStringField("_message", "Transaction saved");
...
避免在消息字段中混合字符串和 json 的正确做法是什么?我应该放弃
MyLogObject
吗?有没有其他方法可以以与我的应用程序日志相同的格式记录 Spring 内容?
可能的解决方案: 使用 JSON 格式的 Logback:
Spring Boot 默认使用 Logback 进行日志记录,您可以将其配置为以 JSON 格式进行日志记录。 您可以通过修改 logback-spring.xml 文件以包含 JSON 格式来自定义 Spring Boot 中的日志记录。 logback-spring.xml 配置示例:
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
{"timestamp":"%date{ISO8601}", "level":"%level", "logger":"%logger", "message":"%message", "exception":"%ex"}
</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
提示: 如果您更喜欢纯 JSON 日志记录以避免混合纯文本和 JSON,最好将日志配置为完全采用 JSON 格式,特别是当您使用 ELK Stack 或 Splun 等日志聚合工具时
如果问题仍然存在,请分享您遇到的具体错误消息,我可以帮助您进一步排除故障。