gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:55:31 25 4
gpt4 key购买 nike

我正在 Play 中编写数据库 log4j 附加程序。

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

这在调试/信息日志上运行良好。但是,不会记录异常。框架代码调用了此附加程序,但我怀疑它不起作用,因为 JPA session 此时无效。

我如何调整代码来支持这个用例?

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

最佳答案

根据我们上面的对话,我很好奇如何做到这一点,并且能够让它发挥作用。本质上,您需要创建一个新的 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() 中我没有处理的异常和失败情况。为了清楚起见,通知是我的项目中的一个基本对象,我可以快速使用它。

希望有帮助!

关于java - 从 Play 编写数据库记录器 - 如何处理错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8688430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com