Log4j2(和 SLF4j 2.0.0-alpha1)和 JsonTemplateLayout——如何将消息序列化为 JSON

Log4j2 (and SLF4j 2.0.0-alpha1) and JsonTemplateLayout--how to serialize Messages as JSON

我正在探索 Log4j 2.14.0 和 SLF4j 2.0 并尝试生成结构化消息。

我的 Appender 设置稍作修改 LogstashJsonEventLayoutV1.json,

<JsonTemplateLayout eventTemplateUri="classpath:LogstashJsonEventLayoutV1-test.json" properties="true" />

我删除了时间戳和主机名(我这样做是作为单元测试的一部分)并修改了“消息”的配置,如下所示:

"message": {
        "$resolver": "message",
        "fallbackKey": "formattedMessage"}

当我记录一些东西时

log4jLogger.atInfo().log(new MapMessage(Map.of("hello", "world")));

它显然正在生成 JSON 化的日志消息:

{"@version":1,"message":{"hello":"world"},"thread_name":"Test worker","level":"INFO","logger_name":"java.lang.Integer"}

在生产中,我的商店通常通过 SLF4J 使用 Log4J。我愿意使用 SLF4J 的 2.0.0-alpha1 版本来实现这个目标。我如何通过 SLF4J 的流利 API 通过 addKeyValue 实现同样的事情?

logger.atDebug().addKeyValue("oldT", oldT).addKeyValue("newT", newT).log("Temperature changed.");

一天结束时,我只是包装了 log4j——对于这个用例,当我只能以 log4j 为目标时,没有办法包装 Slf4j。