记录时异常有什么好处?

时间:2012-04-11 11:56:20

标签: java exception logging

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

我应该将堆栈跟踪传递到log.error()还是只有例外toString()?或者做些更好的事情?

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

3 个答案:

答案 0 :(得分:5)

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

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

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

另请注意,许多重要的例外都没有提供有意义的消息,NullPointerException是重要的例子。

答案 1 :(得分:1)

我当然会去记录整个堆栈跟踪。通过这种方式找到它更容易。

我不知道您使用哪个库进行日志记录,但如果它不支持记录异常,您可以通过这种方式将stacktrace作为字符串获取:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
exception.printStackTrace(ps);
ps.close();
String stacktrace = baos.toString();

答案 2 :(得分:0)

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

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

Log4j将负责打印堆栈跟踪。

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

logger.error("", e);

不是

logger.error(e); // bad usage! This uses e.toString()!!