我需要编写一个小的日志分析器应用程序来处理由我的项目中使用的第三方封闭源库(在里面有自定义记录器)生成的一些日志文件。
如果日志中有异常条目,我需要从异常的顶部到实际位置收集有关堆栈跟踪所涉及方法的汇总信息。
不幸的是,默认情况下,Java printStackTrace()不会打印调用堆栈中的每个方法,但最多只打印一定数量,其余的只是引用为16 more...
。
如果我能自己捕获异常,我会使用getStackTrace()并自己打印,但根本原因从未包含在此库抛出的异常中。
有没有办法让Java在堆栈跟踪中打印整个调用堆栈?
除了我的情况,常见的日志记录框架有选择吗?
编辑:该程序在Sun的JVM上使用JDK 1.5.0_09运行。没有选择改变它。
答案 0 :(得分:29)
here is an explanation打印跟踪中的“由...引起”和“... n 更多”行。另见JavaDoc for printStackTrace。你可能没有任何工作要做。
注意是否存在包含字符“...”的行。这些行表示此异常的堆栈跟踪的剩余部分匹配由此异常(“封闭”异常)引起的异常的堆栈跟踪底部的指示帧数。这种简写可以大大减少输出的长度,在这种情况下,从捕获“致使异常”的同一方法抛出包装异常。
答案 1 :(得分:5)
你不能用Thread.currentThread().getStackTrace()
做点什么吗?
这是一个真实的简单示例,它以递归方式调用方法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();
}
}
}
答案 2 :(得分:-1)
可能您可以尝试迭代返回的数组:
Thread.currentThread().getStackTrace();