如何将异常的堆栈跟踪打印到除了stderr之外的流中? 我发现一种方式是使用getStackTrace()并将整个列表打印到流中。
Throwable.printStackTrace()有一种替代形式,它接受一个输出流作为参数。
http://download.oracle.com/javase/6/docs/api/java/lang/Throwable.html#printStackTrace(java.io.PrintStream)例如:
catch(Exception e) {
e.printStackTrace(System.out);
}
这将把堆栈跟踪信息打印到标准输出而不是标准错误。
e.printStackTrace(new PrintStream("path.txt"))
代替 System.out
。 - Mauricio Gracia Gutierrez虽然不太美观,但仍是一个解决方案:
StringWriter writer = new StringWriter();
PrintWriter printWriter = new PrintWriter( writer );
exception.printStackTrace( printWriter );
printWriter.flush();
String stackTrace = writer.toString();
针对Android开发最简洁的方法:Log.getStackTraceString(exception)
Apache Commons提供了将Throwable类型的堆栈跟踪转换为字符串的工具。
用法:
ExceptionUtils.getStackTrace(e)
完整文档请参考https://commons.apache.org/proper/commons-lang/javadocs/api-release/index.html
我创建了一个方法,可以帮助获取堆栈跟踪:
private static String getStackTrace(Exception ex) {
StringBuffer sb = new StringBuffer(500);
StackTraceElement[] st = ex.getStackTrace();
sb.append(ex.getClass().getName() + ": " + ex.getMessage() + "\n");
for (int i = 0; i < st.length; i++) {
sb.append("\t at " + st[i].toString() + "\n");
}
return sb.toString();
}
Throwable类提供了两种方法,分别是printStackTrace
和PrintWriter
以及PrintStream
,可以将堆栈跟踪输出到给定的流中。建议使用其中之一。
使用 slf4j,例如通过 lombok
的 @Slf4j
注解
log.error("error", e);
请查看javadoc。
out = some stream ...
try
{
}
catch ( Exception cause )
{
cause . printStrackTrace ( new PrintStream ( out ) ) ;
}
如果您对更紧凑的堆栈跟踪感兴趣,并且带有更多信息(包详细信息),则它看起来像:
java.net.SocketTimeoutException:Receive timed out
at j.n.PlainDatagramSocketImpl.receive0(Native Method)[na:1.8.0_151]
at j.n.AbstractPlainDatagramSocketImpl.receive(AbstractPlainDatagramSocketImpl.java:143)[^]
at j.n.DatagramSocket.receive(DatagramSocket.java:812)[^]
at o.s.n.SntpClient.requestTime(SntpClient.java:213)[classes/]
at o.s.n.SntpClient$1.call(^:145)[^]
at ^.call(^:134)[^]
at o.s.f.SyncRetryExecutor.call(SyncRetryExecutor.java:124)[^]
at o.s.f.RetryPolicy.call(RetryPolicy.java:105)[^]
at o.s.f.SyncRetryExecutor.call(SyncRetryExecutor.java:59)[^]
at o.s.n.SntpClient.requestTimeHA(SntpClient.java:134)[^]
at ^.requestTimeHA(^:122)[^]
at o.s.n.SntpClientTest.test2h(SntpClientTest.java:89)[test-classes/]
at s.r.NativeMethodAccessorImpl.invoke0(Native Method)[na:1.8.0_151]
你可以尝试使用Throwables.writeTo来自spf4j库。
getStackTrace
方法,该方法将返回一个StackTraceElement
对象数组,你可以将其组合成一个字符串(使用该对象的toString方法来获取一行跟踪信息)。 - jcubic