16

私は愚か者か何かに違いありませんが、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);
        }
    }
}

ロギング メソッドでは、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 (違いがある場合)。

誰かが私の思考能力の欠点を指摘してくれたら、とてもありがたいです!

4

1 に答える 1

27

追加の調査を行いましたが、コンパイルエラーを取得する唯一の方法は

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

1.7 (varargs のサポートが導入された) より前の SLF4J API のバージョンを使用することです。次のステートメントが当てはまらない場所を見つけるには、おそらくクラスパス (またはサーバー ランタイム?) を掘り下げる必要があります。

ライブラリのバージョンは次のとおりです: slf4j-api-1.7.5.jar、slf4j-log4j12-1.7.5.jar、および log4j-1.2.14.jar (違いがある場合)。

(それは確かにあなたが観察した違いを正確に生み出すからです)

于 2013-09-30T16:03:29.030 に答える