2013-03-04 73 views
3

我正在研究企業系統的日誌記錄框架,並且一直在將logback和log4j視爲日誌後端,但試圖使用slf4j來保留後端實現。記錄任意對象

我們希望以JSON格式記錄消息,並且我已經找到了一個用於log4j的佈局類和一個用於執行該操作的logback的編碼器。但是,我們希望能夠將任意鍵/值對添加到JSON輸出。

我希望佈局/編碼器能夠檢測到什麼類型的對象正在被記錄,並在地圖的情況下,它會將鍵/值對添加到JSON,但對於其他任何東西,它只是toString ()它。

但這似乎不可能,因爲slf4j接口似乎僅限於記錄String對象。

我已經閱讀過關於標記,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是一個明確的補充,但也許不是必需的。

+2

隱藏這背後的實現自己的日誌類的,加上信息的重載需要地圖作爲參數? – 2013-03-04 14:06:10

回答

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);