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

Posted

技术标签:

【中文标题】如何使用 SLF4J 使用占位符记录异常和消息【英文标题】:How to log exception and message with placeholders with SLF4J 【发布时间】:2011-08-22 12:19:34 【问题描述】:

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

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

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

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

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

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

这不漂亮。

【问题讨论】:

您的第一个 logger.error 行在 slf4j 版本 1.7.25 中可以正常工作。 【参考方案1】:

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

faq entry 中记录了此功能,javadocs for Logger 中也引用了该功能。

【讨论】:

Javadoc 中有描述吗?我期待在这里找到类似的信息:slf4j.org/apidocs/org/slf4j/Logger.html 我相信你,但就像 @Scot 一样,我希望这种行为会被记录下来。 Scot,@Stephan - 上述行为似乎记录在他们的常见问题解答here。 这就像一个保守的秘密。感谢您指出。我的后续问题是他们为什么要隐藏在 var-arg 中这是可能的事实?为什么他们不能创建一个新的重载方法,该方法采用Throwable,然后有一个 var-arg?是否存在擦除问题?这是其他库中将异常作为最后一个参数传入的标准吗? 这已经(从那时起?)被记录在常见问题解答中:slf4j.org/faq.html#paramException。我同意应该更清楚地记录此功能。【参考方案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 编译器将调用错误方法,采用一个 String 和两个 Object 参数。 SLF4J 按照程序员最可能的意图,会将 NumberFormatException 实例解释为 throwable 而不是未使用的 Object 参数。在 1.6.0 之前的 SLF4J 版本中,NumberFormatException 实例被简单地忽略了。

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

【讨论】:

以上是关于如何使用 SLF4J 使用占位符记录异常和消息的主要内容,如果未能解决你的问题,请参考以下文章

为啥要使用SLF4J而不是Log4J

为啥要使用SLF4J而不是Log4J

SLF4J

关于Slf4j中占位符{}

为啥使用 SLF4J 而不是 Log4J 来做 Java 日志

使用 jdk 进行 slf4j 日志记录 – 如何启用调试?