2013-07-18 6 views
12

私は愚かでなければなりませんが、varargs-utilizingパラメータ化されたSLF4Jのログ方法を使用できないようです。 例:ロギング方法でSLF4Jは、varargsメソッドを使用したログ記録をパラメータ化しました

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

、Eclipseは、そのような警告生成:

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", new Object[]{x, y, 3, e}); 

ため

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

ないため、コンパイルエラーを取得する唯一の方法は、従来の1.7にSLF4J APIのバージョンを使用することです( varargsのサポートが導入されました)。

ライブラリのバージョンは次のとおりです:SLF4J-API-1.7.5.jar、SLF4J-log4j12-あなたは、おそらく次の文は真であることに失敗した場所を見つけるために、あなたのクラスパス(?またはサーバーの実行時)に掘るする必要があります1.7.5.jarとlog4j-1.2.14.jar(何らかの違いがあれば)。

(それは確かにあなたが観察した正確に違いがあるため)

関連する問題