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

2022-08-31 10:16:01

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

我尝试过这样做,但从未打印异常堆栈跟踪:

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

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

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

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

这并不漂亮。


答案 1

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

此功能记录在 faq 条目中,该条目在 Javadocs for Logger 中也有引用。


答案 2

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 编译器将调用 error 方法,获取一个 String 和两个 Object 参数。SLF4J,根据程序员最有可能的意图,将NumberFormatException实例解释为可抛出的,而不是未使用的Object参数。在 1.6.0 之前的 SLF4J 版本中,NumberFormatException 实例被完全忽略。

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


推荐