3

我正在为企业系统开发日志框架,并且一直将 logback 和 log4j 作为日志后端,但尝试使用 slf4j 来阻止后端实现。

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

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

然而,这似乎是不可能的,因为 slf4j 接口似乎仅限于记录 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 无疑是一个优势,但如果使用特定后端的好处超过与后端无关的好处,则可能没有必要。

4

1 回答 1

2

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

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);
于 2013-03-04T13:55:17.943 回答