从Play编写数据库记录器 - 如何处理错误?

时间:2011-12-31 13:43:17

标签: java log4j playframework

我正在Play中编写数据库log4j appender。

append()方法上,它创建一个模型实体Log4jLine的新实例,并通过JPA创建saves()

这在调试/信息日志上工作正常。但是,不会记录异常。 从框架代码调用此appender,但我怀疑它不起作用,因为此时JPA会话无效。

我如何调整代码以支持此用例?

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

1 个答案:

答案 0 :(得分: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()中的异常和失败案例。而且为了清楚起见,Notification是我项目中的一个基本对象,我能够快速使用它。

希望有所帮助!