Imprimir pilha de chamadas completa sobre printStackTrace ()?
-
20-08-2019 - |
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.
Solução
aqui é um explicação do 'causada por 'e' ... n mais' linhas no rastreamento impresso. veja também a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html#printStackTrace%28%29" rel="nofollow noreferrer"> JavaDoc . você pode não ter qualquer trabalho a fazer.
Observe a presença de linhas que contém os caracteres "...". Estas linhas indicam que o restante do rastreio da pilha para esta excepção coincide com o número indicado de tramas, desde a parte inferior da pilha de traço a excepção de que era causado por esta excepção (o "envolvente" excepção). Esta forma abreviada pode reduzir significativamente o comprimento da saída no caso comum, onde uma excepção embrulhado é lançada a partir do mesmo método que "excepção causador" é travado.
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();