假设我想在日志中反映异常。
我应该将堆栈跟踪传递到log.error()
还是只有例外toString()
?或者做些更好的事情?
如何获取堆栈跟踪字符串以传递给记录器?
答案 0 :(得分:5)
所有现代日志框架都将传递的Exception
对象特殊处理:
log.error("Danger! High Voltage!", ex);
框架(让它为logback或log4j)将很好地为您设置堆栈跟踪的格式。始终记录完整的堆栈跟踪,除非您确实知道您在做什么。否则,您始终可以过滤掉给定记录器中的异常。
另请注意,许多重要的例外都没有提供有意义的消息,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()!!