Logback - 使用字符串日志和应用程序日志创建自定义 json 的正确方法

问题描述 投票:0回答:1

我正在尝试创建自定义日志格式,因为我的应用程序正在运行 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 内容?

spring-boot logback logstash-logback-encoder
1个回答
0
投票

可能的解决方案: 使用 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 等日志聚合工具时

如果问题仍然存在,请分享您遇到的具体错误消息,我可以帮助您进一步排除故障。

© www.soinside.com 2019 - 2024. All rights reserved.