在printStackTrace()上打印完整的调用堆栈?

我需要编写一个小型日志分析器应用程序来处理由我的项目中使用的第三方封闭源代码库(里面有自定义logging器)生成的一些日志文件。

如果在日志中inputexception,我需要收集关于堆栈跟踪的方法的汇总信息,从顶部到exception的实际位置。

不幸的是,在默认情况下,Java printStackTrace()不会打印调用堆栈中的每个方法,但是达到一定数量,剩下的仅仅被引用为16 more...

如果我自己可以捕获exception,我会使用getStackTrace()并自己打印它,但根本原因永远不会包含在这个库引发的exception中。

有没有办法让Java打印堆栈跟踪中的整个调用堆栈?

除了我的情况,常见的日志框架可以select吗?

编辑:该程序在JDK 1.5.0_09的Sun JVM上运行。 没有select来改变这一点。

这里是对打印轨迹中“由…造成”和“…多于”行的解释 。 另请参阅用于printStackTrace的JavaDoc 。 你可能没有任何工作要做。

注意包含字符“…”的行的存在。 这些行表明这个exception的堆栈跟踪的其余部分与由exception(“封闭”exception)引起的exception的堆栈跟踪底部的指定数目的帧匹配。 这种简写可以大大减less常见情况下的输出长度,在这种情况下,捕获的“引发exception”被捕获的包装exception是从相同的方法抛出的。

你不能用Thread.currentThread().getStackTrace()做什么吗?

下面是一个简单的例子,recursion地调用一个方法20次,然后抛出当前线程的堆栈。

 public class Test { public static void main(String[] args) { method(); } static int x = 0; private static void method() { if(x>20) { StackTraceElement[] elements = Thread.currentThread().getStackTrace(); for(int i=0; i<elements.length; i++) { System.out.println(elements[i]); } } else { x++; method(); } } } 

也许你可以尝试迭代由以下内容返回的数组:

 Thread.currentThread().getStackTrace();