Program Tip

로그에서 잘리는 스택 추적을 어떻게 중지합니까?

programtip 2020. 11. 8. 10:56
반응형

로그에서 잘리는 스택 추적을 어떻게 중지합니까?


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던집니다 .HighLevelExceptionException

다른 답변에서 언급했듯이 스택 추적은 실제로 잘리지 않으며 전체 스택 추적이 표시됩니다. .. .3 more는 달리 중복 때문에 내 예제가있다. 중복되고 출력 라인을 낭비하려면 다음 .. 3 more으로 대체 할 수 있습니다.

at Junk.b(Junk.java:17)
at Junk.a(Junk.java:11)
at Junk.main(Junk.java:4)

그러나이 세 줄은 이미 암시되어 있기 때문에 출력 할 필요가 없습니다.


-XX:MaxJavaStackTraceDepthJVM 옵션을 늘리십시오 .


나는 이것이 전체 그림을 얻는 데 유용하다는 것을 알았습니다. 예외 원인에 대한 전체 스택 추적을 가져옵니다 (주 예외에서 반복되는 행을 자주 표시하지만 도움이 될 수 있음).

        ... 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

반응형