16

我一定是笨蛋什么的,但我似乎无法使用 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);
        }
    }
}

在 logging 方法上,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 之前的 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 回答