首先,我为所有不可恢复的异常抛出运行时异常,这导致这些异常传递到容器,我目前使用错误页面(在web.xml中定义)。在此错误页面中是一个调用记录器的scriptlet。
我遇到的问题是在此调用时异常不再在堆栈上。我可以从请求范围变量(“javax.servlet.error.message”)访问它。该字符串是堆栈跟踪。我显然需要这个堆栈跟踪用于记录目的,并且出于安全原因,可以在不同的应用服务器“javax.error_message”关闭.......
所以我的问题是,如何在Java EE应用程序中最好地记录运行时异常而不包含所有内容:
try {} catch (Exception e) {logger.log(...)}
我想要某种方式从容器中调用记录器,也许......就在容器捕获异常之前,例如。
答案 0 :(得分:3)
我找到了解决方案。通过添加响应过滤器并包装chain.doFilter(req,resp),如下所示:
try {
chain.doFilter(req,resp);
} catch (Exception e) {
logger.error("", e);
throw new RuntimeException(e);
}
到目前为止工作正常,并且不依赖于特定的框架或应用服务器。
答案 1 :(得分:1)
在Servlet API中我没有任何知识可以实现这一点。
但是,您可以在Tomcat中使用实例侦听器执行此操作。您可以在context.xml中安装一个侦听器,如下所示,
<InstanceListener>myapp.MyListener</InstanceListener>
Tomcat在容器捕获异常之后并在它再次抛出异常之前立即触发InstanceEvent.AFTER_SERVICE_EVENT
事件。您可以在那里调用记录器。
答案 2 :(得分:0)
如果我错了,请纠正我,但'exception'对象作为变量出现..在'error'jsp中称为'exception'。您始终可以使用此对象来记录检索异常信息并登录错误jsp本身。
答案 3 :(得分:0)
AOP (Aspect Oriented Programming)将是我的首选。
您定义: