我正在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();
}
}
答案 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是我项目中的一个基本对象,我能够快速使用它。
希望有所帮助!