Pergunta

Eu preciso escrever um aplicativo de analisador de log pequeno para processar alguns arquivos de log gerados por um terceiro partido fechou biblioteca de origem (tendo logger personalizada dentro) usado no meu projeto.

No caso de uma entrada de exceção no log eu preciso coletar informações agregadas sobre os métodos envolvidos ao longo do rastreamento de pilha a partir do topo para o lugar real da exceção.

Infelizmente, por padrão Java printStackTrace () não imprime cada método na pilha de chamadas, mas até um determinado número e o resto é apenas referenciado como 16 more....

Se eu pudesse capturar a exceção mim eu usaria o getStackTrace () e imprimi-lo eu mesmo, mas a causa raiz não está incluído na exceção esta biblioteca joga.

Existe uma maneira de pedir Java para imprimir toda a pilha de chamadas no stacktrace?

Além de minha situação fazê-estruturas de registo comum tem opção para isso?

Editar: O programa é executado na JVM da Sun com JDK 1.5.0_09. Nenhuma opção para mudar isso.

Outras dicas

Você não pode fazer algo com Thread.currentThread().getStackTrace()?

Aqui está um exemplo simples real, que chama um método de forma recursiva 20 vezes e, em seguida, despeja a pilha do thread atual.

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();
        }
    }
}

Pode ser que você pode tentar iterar a matriz retornada por:

Thread.currentThread().getStackTrace();
scroll top