2010-02-26 5 views
19

현재 Tomcat, Spring 및 JAVA를 사용하여 응용 프로그램을 빌드 중입니다. 내 로깅 라이브러리로 Log4J을 사용하고 있습니다. 나는 현재 모든 것을 텍스트 파일에 로깅하고있다. 내가 겪고있는 문제 중 하나는 RuntimeExceptions이 (가) 모든 파일에 기록되지 않는다는 것입니다. 어쩌면 내 응용 프로그램 로그 파일에 던져진 모든 RuntimeExceptions을 기록하는 방법이 있는지 궁금 해서요. 그렇지 않다면 다른 로그 파일에 로그 할 수 있습니까? 이것을하기위한 표준 방법이 있습니까? 그렇다면 Tomcat에서 애플리케이션을 실행할 때 이것을 수행하는 표준 방법이 있습니까?로그 런타임 log4j를 사용하는 Java의 예외

도움을 주셔서 감사합니다.

+2

당신이 "캐치되지 않는"들이 RuntimeException을 의미합니까? –

+0

예 "잡히지 않음"을 의미합니다. RuntimeExceptions – DkS

답변

21

내가 찾고있는 것이 확실하지 않지만 스레드를 종료하는 예외 처리기가 있습니다. thread의 타겟으로 명시 적으로 캐치되지 않는 예외에 대한 핸들러입니다.

기본 "캐치되지 않는 예외 처리기"는 Throwable에서 printStackTrace()을 호출하여 스택 추적을 System.err으로 인쇄합니다. 그러나, 당신이 할 수 replace log4j 대신에 예외를 기록 자신의 UncaughtExceptionHandler이 :

class Log4jBackstop implements Thread.UncaughtExceptionHandler { 

    private static Logger log = Logger.getLogger(Log4jBackstop.class); 

    public void uncaughtException(Thread t, Throwable ex) { 
    log.error("Uncaught exception in thread: " + t.getName(), ex); 
    } 

} 

당신은 실행 프로그램 프레임 워크를 사용하는 경우가있는 당신이 Runnable 개체를 전달할 수는 그 스레드는 아마 않도록 자신의 catch 블록이 캐치되지 않는 예외 핸들러에 도달하는 예외가 있습니다. 당신이 거기 Runtime 예외를 포착하려면, 할 수있는 한 가지 방법은 다음과 같이 로깅 래퍼에서 각 작업을 래핑하는 것입니다 :

class Log4jWrapper { 

    private final Logger log; 

    private final Runnable target; 

    Log4jWrapper(Logger log, Runnable target) { 
    this.log = Objects.requireNonNull(log); 
    this.target = Objects.requireNonNull(target); 
    } 

    public void run() { 
    try { 
     target.run(); 
    } catch(RuntimeException ex) { 
     log.error("Uncaught exception.", ex); 
     throw ex; 
    } 
    } 

} 

... 

Runnable realTask = ...; 
executor.submit(new Log4jWrapper(Logger.getLogger(Whatever.class), realTask)); 
+0

이 RuntimeExceptions는 일반적으로 응용 프로그램에서 어떻게 처리됩니까? 이것이 이것을 처리하는 표준 방법인지 궁금합니다. – DkS

+0

또한 Spring API에서 ThreadPoolTaskExecutor를 사용하고 있는데이 클래스를 사용하여 수행 할 수있는 작업인가요? – DkS

+0

이것은 Runnable에 RuntimeException이있는 경우에 훌륭하게 작동하지만 ThreadPoolTaskExecutor에서 예외가 발생하면 어떻게됩니까? 풀이 올바로 구성 되었기 때문에 RunTimeException을 던졌습니다.이 메시지는 여전히 콘솔에 인쇄되고 기록되지 않습니다. 제안 사항은 무엇입니까? – DkS

1

로더를 사용하도록 StdErr을 리디렉션 할 수 있습니다. 이것은 처리되지 않은 예외를 포함해야하는 std err에 기록 된 결과를 출력해야합니다.

이 블로그 포스트는 로거의 일부인 FileHandler로 리디렉션하는 방법에 대한 좋은 요약을 제공합니다. 캐치되지들이 RuntimeException (또는 그 문제에 대한 모든 캐치되지는 Throwables)를 기록 할

https://blogs.oracle.com/nickstephen/entry/java_redirecting_system_out_and

12

한 가지 방법은 Thread.UncaughtExceptionHandler를 구현하는 클래스를 만드는 것입니다. 이 클래스의 uncaughtException() 메서드는 예외 정보를 로그에 씁니다. 잡히지 않은 RuntimeException이 코드에

Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler()); 

을 추가하여 줄을 끝낼 때마다 JVM이이 예외 처리기를 호출하도록 할 수 있습니다.