gpt4 book ai didi

java - 记录任意对象

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:30:15 24 4
gpt4 key购买 nike

我正在为企业系统开发一个日志框架,一直在将 logback 和 log4j 作为日志后端,但试图使用 slf4j 将后端实现排除在外。

我们想以 JSON 格式记录消息,我找到了一个用于 log4j 的布局类和一个用于执行此操作的 logback 的编码器。但是,我们希望能够将任意键/值对添加到 JSON 输出。

我希望 Layout/Encoder 能够检测到正在记录什么类型的对象,在 Map 的情况下,它会将键/值对添加到 JSON,但对于其他任何东西,它只会 toString( )它。

但这似乎是不可能的,因为 slf4j 接口(interface)似乎仅限于记录 String 对象。

我已经阅读了 Markers、MDC 和 NDC,但似乎没有一个能很好地满足我的需求。

澄清一下,这是一个最佳代码片段:

Map m = new HashMap();
m.put("foo", "bar");
m.put("baz", "fluffbunny");
log.info(m);

这将输出如下内容:

{ "timestamp": "2013-03-04T13:33:40", "foo": "bar", "baz": "fluffbunny" }

{ "timestamp": "2013-03-04T13:33:40", "message": { "foo": "bar", "baz": "fluffbunny" } }

会有一些解决方法,例如将 JSON 字符串呈现为消息或在日志语句周围使用 MDC(我的布局/编码器类正确呈现 MDC 和 NDC),但这两种情况都会使日志行困惑。

所以我的问题是是否有一些方便的方法可以做到这一点。坚持使用 SLF4J 无疑是一个优势,但如果使用特定后端的好处超过后端不可知论的好处,则可能没有必要。

最佳答案

我只需要一个 LoggableMap,使用 SLF4J 输出 JSON 作为它的 toString

Map m = new Loggable();
m.put("foo", "bar");
m.put("baz", "fluffbunny");
// Note the use of {} to log an arbitrary object rather than a String
log.info("{}", m);

关于java - 记录任意对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15202842/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com