복붙노트

[SPRING] log4j를 사용하여 Java에서 로그 런타임 예외

SPRING

log4j를 사용하여 Java에서 로그 런타임 예외

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

당신의 도움에 미리 감사드립니다!

해결법

  1. ==============================

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

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

    디폴트의 ​​「캐치되지 않는 예외 핸들러」는 Throwable의 printStackTrace ()를 호출 해, 스택 트레이스를 System.err에 출력합니다. 그러나 대신 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 객체를 전달하는 Executor 프레임 워크를 사용하고 있다면, 쓰레드는 catch되지 않은 예외 핸들러에 예외가 도달하지 못하도록하는 자체 catch 블록을 가지고있을 것입니다. 거기에 런타임 예외를 잡으려면 다음과 같이 로깅 래퍼에 각 작업을 래핑하는 것이 한 가지 방법입니다.

    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));
    
  2. ==============================

    2.잡히지 않은 RuntimeExceptions (또는 잡히지 않는 Throwable)를 기록하는 한 가지 방법은 Thread.UncaughtExceptionHandler를 구현하는 클래스를 만드는 것입니다. 이 클래스의 uncaughtException () 메소드는 단순히 예외 세부 사항을 로그에 씁니다. 잡히지 않은 RuntimeException이 행을 추가하여 스레드를 종료 할 때마다 JVM이이 예외 핸들러를 호출하게 할 수 있습니다

    잡히지 않은 RuntimeExceptions (또는 잡히지 않는 Throwable)를 기록하는 한 가지 방법은 Thread.UncaughtExceptionHandler를 구현하는 클래스를 만드는 것입니다. 이 클래스의 uncaughtException () 메소드는 단순히 예외 세부 사항을 로그에 씁니다. 잡히지 않은 RuntimeException이 행을 추가하여 스레드를 종료 할 때마다 JVM이이 예외 핸들러를 호출하게 할 수 있습니다

    Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler());
    

    귀하의 코드에.

  3. ==============================

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

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

    이 블로그 게시물은 로거의 일부인 FileHandler로 리디렉션하는 방법에 대한 좋은 개요를 제공합니다.

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

  4. from https://stackoverflow.com/questions/2344654/log-runtime-exceptions-in-java-using-log4j by cc-by-sa and MIT license