2017-02-17 34 views
1

是否有任何日誌記錄庫允許結構化記錄對象,我的意思是說,輸出結構化的形式,如JSON或XML?我該如何做結構化記錄?

在應用層面,我想用一個簡潔的語法(日誌往往隱藏應用程序代碼),如

  1. logger.info("Deleting user", user)
  2. logger.info(part("Deleting user", user), part("Account", account), part("Something else", someValue));

在日誌文件的級別,我把結構良好的JSON(等)與元數據(線程,MDC,時間,級別等)一起作爲一個信封,並將我自己的消息作爲結構化的JSON對象,例如

"log" : { 
    "time": <timestamp>, 
    "level": "INFO", 
    "thread": <thread-name>, 
    "MDC": [MDC info added by application code], 
    etc... 
    "message": { 
    "Message": "Deleting User", 
    "User": <JSON object of the user serialised> 
    } 
} 

當然,它不需要漂亮地打印在日誌文件中。

如果域對象(例如用戶)可以實現具有用於不同日誌級別的狀態序列化的方法的接口,那將是很酷的。

  1. INFO級別給出了總結
  2. DEBUG級別提供了更多,更深入的數據,遞歸

*有些日誌聚合可以再進行日誌的意義在語義水平。日誌格式一致,允許搜索等*

我在過去已經實現了幾個函數,這些函數讓我成爲其中的一部分,以確保鍵/值對被格式化,但不會給我我想要的一切。這工作,標準化鍵/值,格式化值,突出空值等,但它不會發出JSON,不能委託對象格式: -

logger.info(logString(part("Deleting user", user), part("Account", account), part("Something else", someValue))); 

任何想法?

+0

嘗試https://github.com/michaeltandy/log4j-json –

+0

@DavidKerr要JSON字符串結構像你上面的豪宅? –

+0

@MayankPandya這是一個開始,但它只是將元數據放入JSON中,它不會將我的對象構造成JSON(我的示例JSON的「消息」部分)。 –

回答

0

您可以使用JSONObject.toString()方法在logcat上打印JSON。

Log.d("tag", jsonObject.toString(4)); 
+0

但我的對象只是一個普通的域對象POJO。默認情況下,他們的日誌代碼只會調用'toString',但是如果域對象實現(例如)'Loggable',那麼它上面的方法可以將域對象轉換爲JSON –

0

這是由message templates解決的問題空間。 Java中的serilogj實現的樣子:

Log.information("Deleting {@user}", user); 

其中@表明user屬性應該被序列化到事件的結構化數據。

即使沒有系列化,消息模板產生具有一流的語義特性的日誌。例如,該事件:

Log.information("Dividing {a} by {b}", 1, 0); 

將由0和屬性a = 1b = 0和產生具有消息除以1的事件。