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

2022-08-31 22:35:22

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

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

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

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

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

除了我的情况之外,常见的日志记录框架是否具有此选项?

编辑:该程序在 Sun 的 JVM 上运行,JDK 为 1.5.0_09。没有选项可以改变这一点。


答案 1

这是对“由”和“...n 更多' 行在打印的跟踪。另请参阅 JavaDoc for printStackTrace。您可能没有任何工作要做。

请注意存在包含字符“...”的行。这些行指示此异常的堆栈跟踪的其余部分与此异常(“封闭”异常)引起的异常的堆栈跟踪底部的指示帧数匹配。在捕获“致病异常”的相同方法引发包装异常的常见情况下,此速记可以大大减少输出的长度。


答案 2

你不能用?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();
        }
    }
}

推荐