48

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

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

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

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

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

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

编辑:该程序在带有 JDK 1.5.0_09 的 Sun JVM 上运行。没有选择改变它。

4

3 回答 3

32

这是对打印跟踪中的“引起”和“... n更多”行的解释。另请参阅printStackTrace 的 JavaDoc。你可能没有任何工作要做。

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

于 2009-06-25T11:47:36.623 回答
7

你不能做点什么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();
        }
    }
}
于 2009-06-25T11:42:17.350 回答
-1

可能您可以尝试遍历返回的数组:

Thread.currentThread().getStackTrace();
于 2009-06-25T11:44:42.883 回答