使用log4j的与Web容器(J2EE服务器的一部分)(Using log4j with Web c

2019-10-18 10:24发布

当我们的应用程序引发的错误,我们赶上,我们把消息和堆栈跟踪在专为我们的应用程序(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 ? 除了醒目的课程代码更改除外。

Answer 1:

然而,对于某些情况下,我们没有捕捉错误...堆栈跟踪被写在server.log中

对我来说,这是一种正常的行为。 一些例外,例如RuntimeException ,由应用服务器捕获并记录在应用程序服务器日志文件(这是全球性的与GlassFish的域)。 你不看,赶上他们,你想要的容器做在这样的情况下它的工作,例如rollbacking交易,否则你就会讨厌的错误。

在这些情况下,我们想送堆栈错误myapp.log。 我知道我们可以在web.xml中定义的异常,并转发给JSP页面,但有什么办法,在这种情况下,不发送堆栈跟踪的server.log而是要myapp.log?

据我所知,这是不可能的。 而且,即使你添加一个<error-page> ,它仍然会捕获该异常所以这不会解决您的“问题”应用程序服务器。 即使你使用Servlet过滤器捕捉Throwable (我不会做),并在应用层记录它,你必须重新抛出来让容器完成它的工作正如我上面提到。 所以它不会解决您的“问题”完全没有。

除了醒目的课程代码更改除外。

不这样做,你不想一网打尽!



Answer 2:

答案是应用程序服务器/ 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 。 在这一点上它已经为时未晚。



文章来源: Using log4j with Web container (part of the J2EE server)