您在问题中提供的信息确实有点微薄,但无论如何我都会试一试。
将异常日志记录限制在请求处理期间发生的那些(根据您的评论),您的第一步是安装 Servlet 过滤器:
@WebFilter(filterName="exceptionHandler", urlPatterns="/*")
public class ExceptionHandler extends HttpFilter {
@Override
public void doFilter(HttpServletRequest request, HttpServletResponse response, HttpSession session, FilterChain chain) throws ServletException, IOException {
try {
chain.doFilter(request, response);
} catch (Exception e) {
// ... handle exception here
}
}
}
如果您已经安装了其他过滤器,您可能需要web.xml 来调整它们的调用顺序。
下一步是对数据库进行异步持久化。这取决于您在 JSF 和 Hibernate 之外使用的堆栈。例如,Java EE 在这里有一个方便的 @Asynchronous 注解,而在 Spring 中它是 @Async。一般来说,JSF 最常与 Java EE 结合使用,但人们说他们使用 Hibernate 而不是 JPA 通常倾向于使用 Tomcat。
对于 Java EE,您将在过滤器中注入一个 EJB,该 EJB 使用 JPA(可能是 Hibernate)和提到的 @Asynchronous 注释:
过滤器:
@WebFilter(filterName="exceptionHandler", urlPatterns="/*")
public class ExceptionHandler extends HttpFilter {
@EJB
private ExceptionPersister exceptionPersister;
@Override
public void doFilter(HttpServletRequest request, HttpServletResponse response, HttpSession session, FilterChain chain) throws ServletException, IOException {
try {
chain.doFilter(request, response);
} catch (Exception e) {
exceptionPersister.persist(e);
}
}
}
EJB:
@Stateless
public class ExceptionPersister {
@PersistenceContext
private EntityManager entityManager;
@Asynchronous
public void persist(Exception exception) {
// use entityManager to persist exception in your
// specific way.
}
}