slf4j logging - 两种错误记录方法的区别(with and w/o Throwable)

slf4j logging - difference between the two error logging methods (with and w/o Throwable)

我正在使用 slf4j 1.7.x for logging in our Java project. The Logger 界面有多种方法可以在 ERROR 级别登录,例如这两个:

void error​(String msg, Throwable t)
void error​(String format, Object... arguments)

我的问题是,如果我想在我的 catch 块中记录一个异常,这两个哪个被认为更好,哪个信息记录在哪个中,如果我有如下情况?

try {
    // Code to call sdk for ABC Service
} catch (AbcServiceException | CredentialException | IOException e) {
    logger.error("Error during getting information from Abc", e);
    //OR
    logger.error("Error during getting information from Abc {} {} ", e.getMessage(), e.getCause());

    return null; // Or return some default value
}

这是一个自以为是的答案,但我更喜欢 throwable-consuming APIs,因为它提供了多级堆栈跟踪并且似乎是项目中最常用的 API。

还要记住 slf4j 1.6 或更高版本可以检测 Object[] 中的最后一个参数是否是异常,也很容易对异常进行参数化日志记录 - 请参见 http://www.slf4j.org/faq.html#paramException 示例。

最后,只写 LOG.error("blah blah {} {}", arg1, arg2, exception) 对我来说效果很好。