我正在为企业系统开发日志框架,并且一直将 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 无疑是一个优势,但如果使用特定后端的好处超过与后端无关的好处,则可能没有必要。