我有一个打印异常的通用函数(使用log4j):
private void _showErrorMessage(Exception e) {
log.error(e.getClass() + ": " + e.getMessage() + ": " + e.getCause() + "\n" + e.getStackTrace().toString());
}
而不是看到我看到的堆栈跟踪:
[Ljava.lang.StackTraceElement;@49af7e68
如何正确查看异常的堆栈跟踪?
log.error(e)< - 显示错误,但不显示堆栈跟踪
答案 0 :(得分:68)
您的日志记录框架应该能够记录异常,因此只需将异常传递给正确的.error(Object, Throwable)
调用即可:
java.util.logging
can do it 如果您的日志记录框架无法做到这一点,或者由于任何其他原因需要String
中的堆栈跟踪,那么它就会变得有点困难。您必须创建PrintWriter
包裹StringWriter
并在.printStackTrace()
上致电Exception
:
StringWriter sw = new StringWriter();
ex.printStackTrace(new PrintWriter(sw));
String stacktrace = sw.toString();
答案 1 :(得分:13)
你试过吗?
private void _showErrorMessage(Exception e) {
log.error("Hey! got an exception", e);
}
答案 2 :(得分:12)
答案 3 :(得分:5)
Throwable.getStackTrace
返回StackTraceElement
个数组,因此toString
方法返回数组本身的文本表示。
为了实际检索堆栈跟踪信息,必须通过每个StackTraceElement
来获取更多信息。
答案 4 :(得分:4)
您还可以查看Google的Guava库。
Throwables.getStackTraceAsString(Throwable throwable)
答案 5 :(得分:1)
你问题的确切答案是你应该像这样调用Log4J:
private void _showErrorMessage(Exception e) {
log.error(e.getClass() + ": " + e.getMessage() + ": " + e.getCause(), e);
}
虽然我会省去对e.getCause()的调用,因为无论如何堆栈跟踪都会给你,所以:
private void _showErrorMessage(Exception e) {
log.error(e.getClass() + ": " + e.getMessage(), e);
}
如果你真的需要一个堆栈跟踪字符串,ExceptionUtils就可以了,但是由于你使用的是Log4J,你不会因为没有利用它的内置异常处理而损失很多。
答案 6 :(得分:1)
Exception Stacktrace logging显示了两种方法,一种基于Apache Commons,另一种使用标准JDK方法。