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

aka*_*okd 42 java logging stack-trace

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

如果日志中有异常条目,我需要从异常的顶部到实际位置收集有关堆栈跟踪所涉及方法的聚合信息.

不幸的是,默认情况下,Java printStackTrace()不会打印调用堆栈中的每个方法,而是打印一定数量,其余的只是被引用为16 more....

如果我能自己捕获异常,我会使用getStackTrace()并自己打印,但根本原因从未包含在此库引发的异常中.

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

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

编辑:该程序在Sun的JVM上使用JDK 1.5.0_09运行.无法改变这一点.

akf*_*akf 29

这里是一个解释的"引起"和"... ñ更多"在印刷迹线.另请参阅printDackTraceJavaDoc.你可能没有任何工作要做.

请注意是否存在包含字符"..."的行.这些行表示此异常的堆栈跟踪的剩余部分匹配由此异常("封闭"异常)引起的异常的堆栈跟踪底部的指示帧数.这种简写可以大大减少输出的长度,在这种情况下,从捕获"致使异常"的同一方法抛出包装异常.


A_M*_*A_M 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 引用:"如果我能自己捕获异常,我会使用getStackTrace()并自己打印" (6认同)