web-dev-qa-db-ja.com

varargsメソッドを使用したSLF4Jパラメーター化ロギング

私は愚かか何かに違いないが、SLF4Jの varargs-utilizing パラメーター化されたロギングメソッドを使用できないようです。例:

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です(違いがある場合)。

誰かが私の思考能力の欠点を指摘してくれるなら、それは非常にありがたいです!

15
Manjabes

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

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

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

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

25
ZachOfAllTrades