PrintStackTrace ()에서 전체 통화 스택 인쇄?
-
20-08-2019 - |
문제
내 프로젝트에 사용 된 타사 폐쇄 소스 라이브러리 (내부에 사용자 정의 로거가있는)가 생성 한 일부 로그 파일을 처리하려면 작은 로그 분석기 응용 프로그램을 작성해야합니다.
로그의 예외 항목의 경우 스택 추적을 따라 관련된 방법에 대한 집계 된 정보를 상단에서 실제 예외 장소로 수집해야합니다.
불행히도 기본적으로 Java PrintStackTrace ()는 통화 스택의 모든 메소드가 인쇄되지 않고 특정 번호까지 인쇄하며 나머지는 방금 참조됩니다. 16 more...
.
내가 직접 예외를 포착 할 수 있다면 getStacktrace ()를 사용하고 직접 인쇄하지만 근본 원인은이 라이브러리가 발생하는 예외에 포함되지 않습니다.
Java에게 스택 트레이스에서 전체 통화 스택을 인쇄하도록 요청하는 방법이 있습니까?
내 상황 외에도 일반적인 로깅 프레임 워크가 이에 대한 옵션이 있습니까?
편집하다: 이 프로그램은 JDK 1.5.0_09와 함께 Sun의 JVM에서 실행됩니다. 그것을 변경할 수있는 옵션이 없습니다.
해결책
설명이 있습니다 '원인'과 '... N 인쇄 된 추적에 더 많은 라인. 참조 PrintStackTrace 용 Javadoc. 할 일이 없을 수도 있습니다.
"..."라는 문자가 포함 된 줄의 존재에 주목하십시오. 이 라인은이 예외에 대한 나머지 스택 추적 이이 예외 ( "Enclosing"예외)에 의해 발생하는 예외의 스택 추적 하단에서 표시된 프레임 수와 일치 함을 나타냅니다. 이 속기는 "원인 예외"와 동일한 방법에서 포장 된 예외가 발생하는 공동 케이스에서 출력 길이를 크게 줄일 수 있습니다.
다른 팁
당신은 함께 할 수 없습니다 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();
}
}
}
다음과 같이 반환 한 배열을 반복하려고 할 수 있습니다.
Thread.currentThread().getStackTrace();