我遇到了一个有趣的目标,这个目标针对使用 wicket 和 hibernate 框架编写的现有 Web 应用程序中的异常处理,假设我们有部署在服务器中的 Web 应用程序,有时它会产生运行时异常,问题是如何获取和保存他们的堆栈跟踪到 db 而不修改所有类(大约 80 个模型和 150 个视图)。
希望我把一切都说清楚了。
提前致谢。
我遇到了一个有趣的目标,这个目标针对使用 wicket 和 hibernate 框架编写的现有 Web 应用程序中的异常处理,假设我们有部署在服务器中的 Web 应用程序,有时它会产生运行时异常,问题是如何获取和保存他们的堆栈跟踪到 db 而不修改所有类(大约 80 个模型和 150 个视图)。
希望我把一切都说清楚了。
提前致谢。
您可以使用 anIRequestCycleListener
来记录/处理您的异常:
public class MyExceptionReporter extends AbstractRequestCycleListener {
@Override
public IRequestHandler onException(RequestCycle cycle, Exception ex) {
// log exception here
return null;
// if you want to also show an error page:
// return new RenderPageRequestHandler(new PageProvider(new ExceptionPage(ex)));
}
}
然后注册它WebApplication#init
:
getRequestCycleListeners().add(new MyExceptionReporter());
覆盖Application.newRequestCycle()
并返回WebRequestCycle
该覆盖的自定义子类,以便为应用程序中RequestCycle.logRuntimeException()
的所有 s 提供额外的日志记录行为。RuntimeException
请注意,任何未捕获Exception
的都将被 Wicket 包装在 a 中WicketRuntimeException
(如请求周期和请求周期处理器的异常处理部分所述):
在那里,使用服务/DAO 组件将异常消息与堆栈跟踪一起插入数据库。请记住,根据 dbms,您可能希望使用 CLOB 而不是 varchar 类型(例如,在 Oracle 中,varchar 列不能容纳超过 4000 个字节)。
这是一个(未经测试的)示例:
public class myApplication extends WebApplication {
...
@Override
public RequestCycle newRequestCycle(Request request, Response response) {
return new myRequestCycle(this, (WebRequest) request, (WebResponse) response);
}
}
public class myRequestCycle extends WebRequestCycle {
...
@Override
protected void logRuntimeException(RuntimeException rex) {
super.logRuntimeException(rex);
Writer w = new StringWriter();
t.printStackTrace(new PrintWriter(w));
String stackTrace = w.toString();
someService.logExceptionToDB(rex.getMessage(),stackTrace);
}
}
编写一个使用 StackTraceElement[] 的实用程序来为您提供完整的堆栈跟踪。使用 OutputStream 的实现将其推送到 CLOB 对象。(我认为不需要 BLOB)