2012-04-11 30 views
2

假设我想反映日志中的异常。在记录日志时异常情况很好?

我是否应该将堆栈跟踪传递到log.error()或只是异常的toString()?或者做更好的事情?

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

回答

5

所有现代的日志框架请客通过Exception对象特殊:

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

框架(让它成为)将很好地格式化堆栈跟踪你。总是记录完整的堆栈跟踪,除非你知道你在做什么。否则,你总是可以从给定的记录器中过滤出异常。

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

+3

+1用于使用'[tag:java]'在回答中学习标签'! – 2012-04-11 12:01:14

+0

@MartijnCourteaux:是的,我非常喜欢这个功能,另请参阅:http://meta.stackexchange.com/questions/123799 – 2012-04-11 12:03:10

1

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

我不知道你用的是什么库记录,但如果它不支持记录异常,你可以得到的堆栈跟踪作为一个字符串是这样的:

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

当使用像log4j,有一个例外一个额外的参数,所以你通常写的是这样的:

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

的Log4j将打印堆栈跟踪的照顾。

有一点要记住(至少log4j的)是这样的:当你不希望记录的消息,但只是例外,您必须使用:

logger.error("", e); 

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