记录任意对象

时间:2013-03-04 13:37:31

标签: java jvm log4j slf4j logback

我正在研究一个企业系统的日志框架,并且一直在查看logback和log4j作为日志记录后端,但是试图使用slf4j来保持后端实现不受其影响。

我们希望以JSON格式记录消息,并且我找到了一个用于log4j的Layout类和一个用于执行该操作的回调编码器。但是,我们希望能够将任意键/值对添加到JSON输出中。

我希望布局/编码器能够检测到正在记录的对象类型,并且在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是一个明确的优势,但如果使用特定后端的好处超过后端不可知的好处,则可能没有必要。

1 个答案:

答案 0 :(得分:2)

我只有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);