如何使用SLF4J使用占位符记录异常和消息

时间:2011-05-10 13:58:54

标签: java logging slf4j

使用SLF4J记录错误消息和异常的正确方法是什么?

我尝试过这样做,但永远不会打印异常堆栈跟踪:

logger.error("Unable to parse data {}", inputMessage, e);

在这种情况下,我想用{}填充inputMessage以及注销异常堆栈跟踪。

我能看到的唯一方法就是这样做:

logger.error("Unable to parse data " + inputMessage, e);

这不漂亮。

2 个答案:

答案 0 :(得分:118)

从SLF4J版本1.6开始,SLF4J将按预期解释最后一个参数,即作为例外。您必须使用旧版本的SLF4J API。

答案 1 :(得分:0)

来自http://www.slf4j.org/faq.html#paramException

是的,从 SLF4J 1.6.0 开始,但不是在以前的版本中。 SLF4J API 支持出现异常时的参数化,假设异常是最后一个参数。因此,

String s = "Hello world";
try {
  Integer i = Integer.valueOf(s);
} catch (NumberFormatException e) {
  logger.error("Failed to format {}", s, e);
}

将按预期打印 NumberFormatException 及其堆栈跟踪。 java 编译器将调用带有一个 String 和两个 Object 参数的 error 方法。根据程序员最可能的意图,SLF4J 会将 NumberFormatException 实例解释为 throwable 而不是未使用的 Object 参数。在 1.6.0 之前的 SLF4J 版本中,NumberFormatException 实例被简单地忽略了。

如果异常不是最后一个参数,它将被视为一个普通对象,并且不会打印其堆栈跟踪。然而,这种情况在实践中不应该发生。