2

假设我想在日志中反映异常。

我应该将堆栈跟踪传递给log.error()还是只是 Exception's toString()?或者做一些更好的事情?

如何获取堆栈跟踪字符串以传递给记录器?

4

3 回答 3

5

所有现代日志框架都将传递的Exception对象视为特殊:

log.error("Danger! High Voltage!", ex);

该框架(让它成为)将为您很好地格式化堆栈跟踪。除非您真的知道自己在做什么,否则请始终记录完整的堆栈跟踪。否则,您始终可以从给定的记录器中过滤掉异常。

另请注意,许多重要的异常并没有提供有意义的信息,NullPointerException是重要的例子。

于 2012-04-11T11:59:06.637 回答
1

我当然会去记录整个堆栈跟踪。以这种方式找到它的来源要容易得多。

我不知道您使用什么库进行日志记录,但如果它不支持记录异常,您可以通过以下方式将堆栈跟踪作为字符串获取:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
exception.printStackTrace(ps);
ps.close();
String stacktrace = baos.toString();
于 2012-04-11T11:57:57.083 回答
0

当使用类似log4j的东西时,异常有一个额外的参数,所以你通常会这样写:

catch(Exception e){
    logger.error("some message", e);
}

Log4j 将负责打印堆栈跟踪。

要记住的一件事(至少对于 log4j)是:当您不想记录消息而只想记录异常时,您必须使用:

logger.error("", e);

不是

logger.error(e); // bad usage! This uses e.toString()!!
于 2012-04-11T12:00:10.420 回答