2015-05-10 151 views
3

有沒有辦法傳遞slf4j記錄器的屬性圖?Java日誌記錄 - slf4j,log4j

例如,我願做這樣的事情:

Logger logger = LoggerFactory.getLogger(SomeClass.class); 

Map data = new HashMap<String, String>(); 
data["key1"] = "value1"; 
data["key2"] = "value2"; 

logger.info("my info message", data) 

然後,我想,我的appender將收到的log4j LoggingEvent上述參數,就像這樣:

public class MyAppender extends AppenderSkeleton { 
... 
... 

@Override 
protected void append(LoggingEvent event) { 
    Map properties = event.getProperties(); 
    String valueOfKey1 = (String) properties.get("key1"); 
    //valueOfKey1 sould be equal to 'value1' 
} 
... 
...  

更新:

是否有任何支持傳遞HashMap數據的java日誌框架(或sim在其界面ILAR)

+0

你錯過了之前的「HashMap的」 – Suspended

+2

「新的」你在找[MDC](http://logback.qos.ch/manual/mdc.html)? – Seelenvirtuose

+0

也許..我不熟悉它..你能詳細說明嗎? –

回答

2

SLF4J Manual「映射診斷上下文」本質上是由日誌框架,其中應用程序代碼提供然後可以通過在日誌消息的日誌框架被插入鍵 - 值對保持的映射。 MDC數據對於過濾消息或觸發某些操作也很有幫助。

SLF4J支持MDC,或映射診斷上下文。如果底層日誌框架提供了MDC功能,那麼SLF4J將委託給底層框架的MDC。請注意,目前只有log4j和logback提供MDC功能。

正如您所標記的問題與log4j和你的例子舉log4j類,SLF4J將允許您設置的值將使用SLF4J API線程基地的MDC地圖。然後這些值將在本地訪問log4j級別LoggingEvent

這是改編自Logback manual(在其意見,並通過@Seelenvirtuose)SLF4J手冊中舉了一個例子:

public class SimpleMDC { 
    static public void main(String[] args) throws Exception { 

    // You can put values in the MDC at any time. Before anything else 
    // we put the first name 
    MDC.put("key1", "value1"); 

    [ SNIP ] 

    Logger logger = LoggerFactory.getLogger(SimpleMDC.class); 
    // We now put the last name 
    MDC.put("key2", "value2"); 

    logger.info("Info log message"); 
    } 
} 

然後,在自定義的appender,你可以easyly獲取值:

public class MyAppender extends AppenderSkeleton { 
... 
... 

@Override 
protected void append(LoggingEvent event) { 
    String valueOfKey1 = (String) event.getMDC("key1"); 
    //valueOfKey1 should be equal to 'value1' 
} 
... 
... 

當然,同樣functionnality是可以通過的logback ...