2010-08-16 67 views
6

我想將帶有Logback的slf4j改造爲遺留應用程序。好的是,遺留應用程序有它自己的日誌框架。所以我所要做的就是改變日誌框架來記錄到slf4j而不是log4j。包裝slf4j API

它像夢一樣工作。我很高興,直到我注意到Logback記錄的每個日誌事件的位置:

Logger.java:... 

Yikes!當試圖找出日誌事件來自何處時,這並不會幫助我的開發人員。

我該如何告訴Logback在堆棧中查找幾個級別以記錄實際位置?

Logger類是一個實用工具類,像這樣的方法:

public static void debug(String clazz, String message) { 
    org.slf4j.Logger logger = LoggerFactory.getLogger(clazz); 
    logger.debug(message); 
} 
+1

類似的問題:HTTP:// stackoverflow.com/questions/1486233/java-logging-show-the-source-line-number-of-the-caller-not-the-logging-helper-m – Thilo 2010-08-16 09:05:41

+0

當它使用log4j時做了這項工作?我想,當你更新一個現有的日誌記錄類時,你並沒有在調用堆棧中添加額外的框架,所以log4j版本應該表現出同樣的問題。 – Thilo 2010-08-16 09:07:18

+1

log4j在其公共API中公開了一個日誌方法,它在堆棧中查找額外的幀,而slf4j則沒有。所以是的,它使用log4j。 – 2010-08-16 09:24:05

回答

10

找到解決方案尋找jcl-over-slf4j的來源。 SLF4J的大多數實現(包括的logback)使用實現LocationAwareLogger,其中有一個期望的包裝記錄器類的完全限定類名稱作爲它的參數之一日誌方法記錄儀:

private static final String FQCN = Logger.class.getName(); 


public static void debug(String clazz, String message) { 
    org.slf4j.Logger logger = LoggerFactory.getLogger(clazz); 
    if (logger instanceof LocationAwareLogger) { 
     ((LocationAwareLogger) logger).log(null, FQCN, LocationAwareLogger.DEBUG_INT, message, null, null); 
    } else { 
     logger.debug(message); 
    } 
} 
5

請參閱如何做到這一點的各種XXX-過SLF4J實現。

基本上你想要完全取代你當前的記錄器框架。不換行slf4j。

編輯:

另一種方法可以編寫自己的佈局繼承你現在使用的一個,它具有%M,%L等領域,其跳過額外的堆棧幀的修訂意義。

+2

我認爲這個解決方案,但目前沒有預算來取代分散在50多個項目中的10000多條日誌語句。 – 2010-08-16 09:17:42

+0

您不需要更改日誌語句,但它調用的代碼(希望在庫中) – 2010-08-16 09:24:05

+1

記錄器框架從所有項目調用10000次以上的方法調用。因此,如果我更換了記錄器框架,是否也不必將所有方法調用替換爲它? – 2010-08-16 09:35:08