2013-07-18 51 views
12

我一定很笨,但我似乎不能使用SLF4J的參數化日誌記錄方法。 一個例子:使用可變參數化方法的SLF4J參數化日誌記錄

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

public class LoggingTest { 

    @Test 
    public void loggingTest() { 
     Logger logger = LoggerFactory.getLogger(this.getClass()); 
     int x = 0xdeadbeef; 
     long y = 0xdeadbeef; 

     try { 
      throw new Exception("This is a mighty exception!"); 
     } catch(Exception e) { 
      logger.error("I wanna log {} and {} and {} with backtrace", x, y, 3, e); 
     } 
    } 
} 

在測井方法,蝕產生這樣的警告:

The method error(String, Object, Object) in the type Logger is not applicable for the arguments (String, int, long, int, Exception) 

和編譯失敗。

不過,如果我更改記錄呼叫:

logger.error("I wanna log {} and {} and {} with backtrace", new Object[]{x, y, 3, e}); 

它編譯並運行正常(記錄3「變量」和異常堆棧跟蹤)。

庫的版本是:slf4j-api-1.7.5.jar,slf4j-log4j12-1.7.5.jar和log4j-1.2.14.jar,如果有區別的話。

如果有人會指出我的思維能力的缺點,它將非常感激!

+0

您的字符串3個佔位符,但4個參數 - 這是故意的? – fge

+1

是的:http://slf4j.org/faq.html#paramException – Manjabes

+0

我認爲[這個答案](http://stackoverflow.com/a/7689819/1523342)很好地解釋它。 – mthmulders

回答

20

我做了一些補充偵查,並得到一個編譯錯誤

logger.error("I wanna log {} and {} and {} with backtrace", x, y, 3, e); 

而不是

logger.error("I wanna log {} and {} and {} with backtrace", new Object[]{x, y, 3, e}); 

的唯一方法是使用一個版本的SLF4J API之前1.7(其中引入了對可變參數的支持)。你可能需要深入挖掘你的classpath(或服務器運行時?)以找到下面的語句不爲真:

庫版本:SLF4J-API-1.7.5.jar,SLF4J-log4j12- 1.7.5.jar和log4j-1.2.14.jar,如果有什麼區別的話。

(因爲它肯定使正是你所觀察到的差異)