【发布时间】:2010-07-12 11:59:48
【问题描述】:
为了调试失败的请求,我想打印来自 HttpServletRequest 的所有信息。
现在,一个请求可能会部分失败(例如,几个匹配成功,但一个失败)在这种情况下,我想在失败的内部方法中捕获异常,打印错误 + ServletUtil .toStringHttpServletRequest() 并继续提供服务(降级但仍然有用与完全请求失败)。
我们当前的实现要么捕获异常并打印哑信息(“getRules failed”),要么将异常一直抛出到 doGet()(有效地为用户取消服务),在 doGet() 中我可以访问 HttpServletRequest我可以在其中打印相关的调试信息(标题、参数...)。
将 HttpServletRequest 传递给可能失败的请求期间调用的每个函数似乎有点难看,如果没有其他优雅的解决方案弹出,我会这样做。
创建一个前置 ServletUtil.toStringHttpServletRequest() 并将其存储在 ThreadLocal 映射中会浪费内存和 CPU 时间。出于某种原因,将 HttpServletRequest 对象存储在 ThreadLocal 中感觉不对(如果我错了,请更正)。
调试信息会写入本地机器日志并直接通过电子邮件发送给开发人员(很棒的工作 log4j TLSSMTPAppender),因此在多个地方登录是不切实际的(需要收集几封电子邮件才能了解发生了什么)并且 ssh'ing 进入服务器已经很老了 :) (我们这里都是阴天......当我看到错误时服务器可能不存在)
所以,我的解决方案是访问“PrintErrorUtility”(TODO:最好命名它)。这将接收 (String errorMsg, Throwable t, HttpServletRequest) 将所有相关信息一起打印错误...这将从内部 try {} catch 块中调用,该块将通知错误但不会取消请求,因为。
显然,我正在考虑在生产中运行的服务器。
评论?请指教。
谢谢你,马克西姆。
【问题讨论】:
标签: java production-environment servlets debug-print