2011-12-31 6 views
1

나는 데이터베이스 log4j appender를 Play에 쓴다.Play에서 데이터베이스 로거 작성하기 - 오류 처리 방법

append() 메서드에서 모델 엔터티 Log4jLine의 새 인스턴스를 만들고 JPA를 통해 saves()을 만듭니다.

디버그/정보 로그에서 정상적으로 작동합니다. 그러나 예외는 기록되지 않습니다. 프레임 워크 코드에서이 appender에 대한 호출이 있지만이 시점에서 JPA 세션이 유효하지 않아 작동하지 않는다고 생각됩니다.

이 사용 사례를 지원하기 위해 코드를 어떻게 적용 할 수 있습니까?

public class DBAppender extends AppenderSkeleton { 
    @Override 
    protected void append(LoggingEvent loggingEvent) { 
     Log4jLine logLine = new Log4jLine(...); 
     logLine.save(); 
    } 
} 
+0

어떻게 수정해야할지 모르겠지만 컨트롤러 메서드 중 하나에서 예외가 발생하면 Play Framework가 트랜잭션을 setRollbackOnly로 표시하기 때문에 이러한 상황이 발생합니다. – Todd

+0

@Todd - 로그를 별도의 트랜잭션으로 작성해야합니다. – ripper234

답변

2

위의 대화를 통해 나는이 작업을 수행하는 방법에 대해 궁금해했으며 제대로 작동 할 수있었습니다. 본질적으로 새로운 EntityManager를 생성하고 완전히 관리해야합니다. Play 내장 함수 (.save(), .merge() 등)를 호출하면 Play에서 설정 한 EntityManager가 사용됩니다. 그러나 표준 JPA 호출로 되돌리면 작동합니다.

// Mapped in routes file as GET /exception   
public static void exceptionTest() { 
    RuntimeException e = new RuntimeException("This is a test"); 
    logException(e); 
    renderText("You are here"); 

} 

private static void logException(RuntimeException e) { 
    EntityManager em = JPA.newEntityManager(); 
    Notification n = new Notification(); 
    n.setMessage(e.getMessage()); 

    em.getTransaction().begin(); 
    em.persist(n); 
    em.getTransaction().commit(); 
    throw e; 
} 

이 점을 증명하기위한 빠르고 단순한 실험입니다. 분명히 처리하지 않는 logException()에서 예외 및 실패 사례를 처리해야합니다. 그리고 명확성을 위해 알림은 내 프로젝트의 기본 개체로,이를 위해 신속하게 사용할 수있었습니다.

희망 하시겠습니까?

관련 문제