当我们的应用程序引发的错误,我们赶上,我们把消息和堆栈跟踪在专为我们的应用程序(myapp.log)创建日志文件。 例如:
public class SomeClass {
OurLogger log = OurLogger.getLogger ("myapp", SomeClass.class);
public void someMethod {
try {
//code
}
catch (DataAccessException e)
{
log.error(e.getMessage(), e);
}
}
}
我们这样做是因为,因为我们是在多个应用驻留在应用服务器上的环境......我们和所有其他应用程序日志,应该从单独server.log
。
然而,对于某些情况下,我们没有捕捉错误...堆栈跟踪被写在server.log
在这些情况下,我们想送堆栈错误myapp.log
。 我知道我们可以在web.xml中定义的异常,并转发给JSP页面,但有什么办法,在这种情况下,不发送堆栈跟踪server.log
而是要myapp.log
? 除了醒目的课程代码更改除外。
然而,对于某些情况下,我们没有捕捉错误...堆栈跟踪被写在server.log中
对我来说,这是一种正常的行为。 一些例外,例如RuntimeException
,由应用服务器捕获并记录在应用程序服务器日志文件(这是全球性的与GlassFish的域)。 你不看,赶上他们,你想要的容器做在这样的情况下它的工作,例如rollbacking交易,否则你就会讨厌的错误。
在这些情况下,我们想送堆栈错误myapp.log。 我知道我们可以在web.xml中定义的异常,并转发给JSP页面,但有什么办法,在这种情况下,不发送堆栈跟踪的server.log而是要myapp.log?
据我所知,这是不可能的。 而且,即使你添加一个<error-page>
,它仍然会捕获该异常所以这不会解决您的“问题”应用程序服务器。 即使你使用Servlet过滤器捕捉Throwable
(我不会做),并在应用层记录它,你必须重新抛出来让容器完成它的工作正如我上面提到。 所以它不会解决您的“问题”完全没有。
除了醒目的课程代码更改除外。
不这样做,你不想一网打尽!
答案是应用程序服务器/ Web容器依赖。 这超越了Java EE规范。 您需要咨询其对细节的文档的“记录”一章。 有些人可能会支持结构,你想要的,但其他人可能不会。
最好的解决办法是有一个全球性的异常处理程序,如<error-page>
您提到自己。 让它侦听java.lang.Exception
或可能Throwable
。 另外,您可以有(或重用)一个Filter
,其侦听/*
,只是把chain.doFilter(request, response)
一个内部try-catch
上块Exception
或可能Throwable
。
编辑:这里是作为意见要求一些代码示例。 首先, Filter
监听上/*
。 我解释它的方式之前,几乎写代码本身:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
try {
chain.doFilter(request, response);
} catch (Exception e) {
logger.error("Caught an uncaught exception.", e);
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
req.getRequestDispatcher("error.jsp").forward(req, res);
}
}
请注意,我会更建议把它放在了“前端控制器” Servlet
你的web应用的。 我不知道,如果你使用任何(这本来是太明显了把它放在那里,虽然)我也不知道,如果你使用一些现有的框架可能已经提供了乱the-这个盒子的解决方案。
和错误页面,好了,你就不能在一个丑陋的小脚本登录异常。
<% logger.error("Caught an uncaught exception", exception); %>
请注意,这仍然记录在例外server.log
。 在这一点上它已经为时未晚。