使用可变参数方法的SLF4J参数化日志记录

18

我可能很愚蠢,但我好像无法使用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,如果有任何差异,请告知。

如果有人指出我的思维能力有所欠缺,我将不胜感激!


您的字符串中有3个占位符,但有4个参数 -- 这是故意的吗? - fge
2
是的:http://slf4j.org/faq.html#paramException - Manjabes
我认为这个答案解释得非常好。 - mthmulders
@mthmulders,jdk1.7.0_05 - Manjabes
我原本想建议您检查IDE中有关“装箱和拆箱转换”的编译器首选项——当我将装箱首选项从默认值(“忽略”)更改为“错误”时,但即使使用您说过可以显式创建对象数组的代码,我仍然遇到了相同的编译失败。我倾向于认为您可能有以下情况之一:a)在类路径上某处有一个旧版本的slf4j api;b)编译器首选项设置为JDK 1.5或更早版本;或c)安装了多个Java版本,并且您并没有真正使用您认为的那个版本。 - ZachOfAllTrades
显示剩余5条评论
1个回答

30

我进行了一些额外的调查,唯一导致编译错误的方式是

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之前的版本(其中引入了对varargs的支持)。 您可能需要深入了解您的类路径(或服务器运行时?)以查找以下语句未能成立的原因:

库版本为:slf4j-api-1.7.5.jar,slf4j-log4j12-1.7.5.jar和log4j-1.2.14.jar,如果有任何区别,请注意。

(因为它确实会产生您观察到的影响)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接