로그에서 잘리는 스택 추적을 어떻게 중지합니까?
Java 로그에서 여러 번 다음과 같은 내용을 얻을 수 있습니다.
Caused by: java.sql.BatchUpdateException: failed batch
at org.hsqldb.jdbc.jdbcStatement.executeBatch(jdbcStatement.java:1102)
at org.hsqldb.jdbc.jdbcPreparedStatement.executeBatch(jdbcPreparedStatement.java:514)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
... 113 more
누구든지 전체 스택 트레이스를 표시하는 방법을 알고 있습니까 (예 : 다른 113 줄 표시)?
(자바 7) JavaDoc에서 의 Throwable에 대한 무슨 일인지 꽤 자세한 설명이 있습니다.
'... 113 more'가 표시되면 'caused by'예외의 나머지 행이 상위 예외의 해당 지점에서 나머지 행과 동일하다는 것을 의미합니다.
예를 들어, 당신은
com.something.XyzException
at ...
at ...
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
at ... <the other 113 lines are here>...
Caused by: <the above>.
두 개의 스택 추적은 AbstractBatcher.executeBatch, 242 행에서 '만남'을 수행 한 후 이후 상향 호출 추적에서 래핑 예외와 동일합니다.
Apache의 Commons Lang 은 중첩 된 스택 트레이스를 '거꾸로'인쇄하는 멋진 유틸리티 메서드 ExceptionUtils.printRootCauseStackTrace () 를 제공합니다. 결과는 훨씬 더 직관적입니다.
printStackTrace () 메서드의 원본 옆에 결과가 표시되면 '113 more'줄이 어디로 갔는지 명확하게 알 수 있습니다.
나는 여기에 있는 예를 좋아한다 :
HighLevelException: MidLevelException: LowLevelException
at Junk.a(Junk.java:13)
at Junk.main(Junk.java:4)
Caused by: MidLevelException: LowLevelException
at Junk.c(Junk.java:23)
at Junk.b(Junk.java:17)
at Junk.a(Junk.java:11)
... 1 more
Caused by: LowLevelException
at Junk.e(Junk.java:30)
at Junk.d(Junk.java:27)
at Junk.c(Junk.java:21)
... 3 more
기본적으로 소스 코드에서 main
전화 function a
통화 function b
하는 전화 통화 ... function e
. Function e
던져 LowLevelException
잡을 함수 C를 일으키는 LowLevelException
및 슬로우 MidLevelException
(포장 LowLevelException
의 내부 인스턴스 MidLevelException
인스턴스. Exception
클래스 랩핑 다른 예외를 도입 할 수있는 생성자를 가진다). 이로 인해 함수 a 는 이전 두 인스턴스를 래핑하는 a를 잡아 MidLevelException
던집니다 .HighLevelException
Exception
다른 답변에서 언급했듯이 스택 추적은 실제로 잘리지 않으며 전체 스택 추적이 표시됩니다. .. .3 more
는 달리 중복 때문에 내 예제가있다. 중복되고 출력 라인을 낭비하려면 다음 .. 3 more
으로 대체 할 수 있습니다.
at Junk.b(Junk.java:17)
at Junk.a(Junk.java:11)
at Junk.main(Junk.java:4)
그러나이 세 줄은 이미 암시되어 있기 때문에 출력 할 필요가 없습니다.
-XX:MaxJavaStackTraceDepth
JVM 옵션을 늘리십시오 .
나는 이것이 전체 그림을 얻는 데 유용하다는 것을 알았습니다. 예외 및 원인에 대한 전체 스택 추적을 가져옵니다 (주 예외에서 반복되는 행을 자주 표시하지만 도움이 될 수 있음).
... catch( Exception e) ...
... catch( NoClassDefFoundError e)
{
for(StackTraceElement ste: e.getStackTrace())
{
System.out.println(ste);
}
if( e.getCause()!=null )
{
for(StackTraceElement ste: e.getCause().getStackTrace())
{
System.out.println(ste);
}
}
}
블로그 게시물에서 "BatchUpdateException : failed batch"이상을 얻는 방법을 설명 했습니다hibernate.jdbc.factory_class=org.hibernate.jdbc.NonBatchingBatcherFactory
. 최대 절전 모드에서 일괄 처리를 비활성화하도록 설정 했습니다 . 일반적으로 BatchUpdateException.getNextException
실패 이유를 확인하는 데 사용할 수 있지만 경우에 따라를 반환 할 수 있습니다 null
. 그런 다음 일괄 처리를 완전히 비활성화하는 것이 유용합니다.
참고 URL : https://stackoverflow.com/questions/437756/how-do-i-stop-stacktraces-truncating-in-logs
'Program Tip' 카테고리의 다른 글
ST 모나드는 어떻게 작동합니까? (0) | 2020.11.08 |
---|---|
ReferenceError를 제공하는 Javascript require () 함수 : require가 정의되지 않았습니다. (0) | 2020.11.08 |
Java의 System.exit ()는 try / catch / finally 블록과 어떻게 작동합니까? (0) | 2020.11.08 |
git에서 커밋 마스터 포인트를 어떻게 변경할 수 있습니까? (0) | 2020.11.08 |
Eclipse / Maven : JUnit 테스트를 실행할 때 컴파일되지 않음 (0) | 2020.11.08 |