Печать полного стека вызовов на printStackTrace()?

Мне нужно написать небольшое приложение анализатора журналов для обработки некоторых файлов журналов, созданных третьей библиотекой закрытых исходников (с встроенным регистратором внутри), используемым в моем проекте.

В случае записи исключения в журнале мне нужно собрать агрегированную информацию о методах, связанных с трассировкой стека, от вершины до фактического места исключения.

К сожалению, по умолчанию Java printStackTrace() не печатает каждый метод в стеке вызовов, а до определенного числа, а остальное просто ссылается на 16 more....

Если бы я мог сам поймать исключение, я бы использовал getStackTrace() и распечатал его сам, но основная причина никогда не включалась в исключение, которое выбрала эта библиотека.

Есть ли способ попросить Java распечатать весь стек вызовов в стеке?

Помимо моей ситуации, общие рамки ведения журнала имеют для этого возможность?

Изменить: Программа работает на Sun JVM с JDK 1.5.0_09. Нет возможности изменить это.

Ответ 1

вот объяснение строк "вызвано" и "... больше" в печатной трассе. см. также JavaDoc для 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();
        }
    }
}

Ответ 3

Может быть, вы можете попробовать выполнить итерацию по массиву, возвращаемому:

Thread.currentThread().getStackTrace();