如何使用SLF4J记录错误消息和异常信息的正确方法是什么?
我尝试过这样做,但异常堆栈跟踪从未被打印出来:
logger.error("无法解析数据 {}", inputMessage, e);
在这种情况下,我想要用{}
填充inputMessage
,并记录异常堆栈跟踪。
我唯一能想到的方法是:
logger.error("Unable to parse data " + inputMessage, e);
这不太好看。
如何使用SLF4J记录错误消息和异常信息的正确方法是什么?
我尝试过这样做,但异常堆栈跟踪从未被打印出来:
logger.error("无法解析数据 {}", inputMessage, e);
在这种情况下,我想要用{}
填充inputMessage
,并记录异常堆栈跟踪。
我唯一能想到的方法是:
logger.error("Unable to parse data " + inputMessage, e);
这不太好看。
Throwable
后再加上可变参数?这里是否有类型擦除问题?其他库中是否有将异常作为最后一个参数传递的标准? - gaoagong从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编译器将调用带有一个字符串和两个对象参数的错误方法。SLF4J将根据程序员最可能的意图,将NumberFormatException实例解释为可抛出的异常而不是未使用的对象参数。在1.6.0之前的SLF4J版本中,NumberFormatException实例被简单地忽略。
如果异常不是最后一个参数,则它将被视为普通对象,并且其堆栈跟踪将不会被打印。然而,在实践中不应该出现这种情况。