Java 如何在捕获的异常上显示堆栈跟踪?

Java 如何在捕获的异常上显示堆栈跟踪?,java,tomcat,stack-trace,Java,Tomcat,Stack Trace,我有一个打印异常的通用函数(使用log4j): 我看到的不是堆栈跟踪,而是: [Ljava.lang.StackTraceElement;@49af7e68 如何正确查看异常的堆栈跟踪 更新 log.error(e)返回一个s数组,因此toString方法返回数组本身的文本表示 为了实际检索堆栈跟踪信息,必须遍历每个StackTraceElement以获取更多信息。您的日志框架应该能够记录异常,因此只需将异常传递给适当的。error(Object,Throwable)调用就足够了: ja

我有一个打印异常的通用函数(使用log4j):

我看到的不是堆栈跟踪,而是:

[Ljava.lang.StackTraceElement;@49af7e68
如何正确查看异常的堆栈跟踪

更新 log.error(e)返回一个s数组,因此
toString
方法返回数组本身的文本表示


为了实际检索堆栈跟踪信息,必须遍历每个
StackTraceElement
以获取更多信息。

您的日志框架应该能够记录异常,因此只需将异常传递给适当的
。error(Object,Throwable)
调用就足够了:

  • java.util.logging
如果您的日志框架不能做到这一点,或者出于任何其他原因,您需要在
字符串中使用堆栈跟踪,那么它就会变得有点困难。您必须创建一个
PrintWriter
包装
StringWriter
,并在
异常上调用
.printStackTrace()

StringWriter sw = new StringWriter();
ex.printStackTrace(new PrintWriter(sw));
String stacktrace = sw.toString();
我用的方法是

你试过了吗

private void _showErrorMessage(Exception e) {
    log.error("Hey! got an exception", e);
}

你也可以看看谷歌的番石榴图书馆


Throwables.getStackTraceAsString(Throwable-Throwable)

您的问题的确切答案是您应该这样调用Log4J:

private void _showErrorMessage(Exception e) {
    log.error(e.getClass() + ": " +  e.getMessage() + ": " + e.getCause(), e);
}
虽然我不需要调用e.getCause(),因为stacktrace会将其提供给您,所以:

private void _showErrorMessage(Exception e) {
    log.error(e.getClass() + ": " +  e.getMessage(), e);
}

如果您真的需要stacktrace的字符串,ExceptionUtils是可以的,但由于您使用的是Log4J,所以如果不使用其内置的异常处理,您会损失很多。

为此显示了两种方法,一种基于Apache Commons,另一种使用标准JDK方法。

当我将异常传递给log.error时,它只显示没有堆栈跟踪的错误消息。使用log4j意味着您调用了错误的版本。有
error(Object)
error(Object,Throwable)
。调用第一个版本将有效地调用
toString()
@Joachim,使用log4j处理异常的方法(他提到要使用log4j)是使用log.error(String,Throwable)记录,并让log4j处理堆栈跟踪。询问者显然没有意识到这点。@Joachim,对不起。似乎log4j信息是在您回答后进行的编辑中添加的。在log4j中调用
log.error(e)
会调用错误版本的方法()。此方法的JavaDoc甚至提到了这样一个事实:“警告注意,将Throwable传递给此方法将打印Throwable的名称,但不会打印堆栈跟踪。要打印堆栈跟踪,请使用error(Object,Throwable)表单。”调用日志。error(e,e)将完成此工作;)@codemonkey,你可以在你最喜欢的搜索引擎中搜索例外部分:我的答案是使用现有的库。我无法维护我发布的所有链接,所以。现在,约阿希姆的回答听起来比我的好:)请读一读。
private void _showErrorMessage(Exception e) {
    log.error(e.getClass() + ": " +  e.getMessage(), e);
}