4

我是 Java 世界的新手,我需要调试一个安静的 Javax Web 服务应用程序。

一些页面引发异常,并且它们被正确记录,但我希望在我的日志中拥有调用代码的页面的 URL,以及堆栈跟踪。

GET 和 POST 信息也很重要。

是否可以?

4

2 回答 2

7

由于您希望将其与堆栈跟踪一起(或接近)出现在错误日志中,因此您可能需要一个Filter.

实现doFilter()方法来检查和记录每个请求的调用 URL。我在下面给出了一些示例代码。

一旦您可以访问该HttpServletRequest对象,您就可以调用它的任何方法。查看您需要的方法getRequestURI()getMethod()哪些方法。

public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException
  {

HttpServletRequest hsr = (HttpServletRequest) request;


String incomingUrl=hsr.getRequestURI(); // fetch URL
String method =hsr.getMethod(); // fetch GET/POST method
logger.debug ("The caller was " + incomingUrl + method); // Send the output to any logger which you have defined
chain.doFilter(request, response);
}

我假设你有一个记录器,你可以将输出发送到你想要的日志文件。

将其映射到类似中的Filterurl 模式,这样它就不会在其他请求上被调用,而只会在您的 Web 服务上被调用。/mywebserviceweb.xml

<filter>
        <filter-name>Logging_URL_Filter</filter-name>
        <filter-class>com.mysite.URLFilter</filter-class>
    </filter>
<filter-mapping>
          <filter-name>Logging_URL_Filter</filter-name>
          <url-pattern>/mywebservice</url-pattern>
    </filter-mapping>
于 2010-08-24T04:45:39.407 回答
1

是的...使用AccessLogValve

例如,在 中c:\Program Files\Apache Software Foundation\Tomcat 6.0\conf\server.xml,将以下内容放入您的<Host>元素中:

   <Valve className="org.apache.catalina.valves.AccessLogValve"
        directory="logs/access-logs/" prefix="localhost_access_log."
        suffix=".log"
        pattern="%h %l %t &quot;%r&quot; %s %b &quot;%{Referer}i&quot; &quot;%{User-Agent}i&quot; %T"
        resolveHosts="false"/> 

有关 % 字段的信息,请参阅文档。例如,您要求获取 GET 和 POST 信息;该方法由 %r(或 %m)字段显示。如果您需要查询参数,它们将成为 GET 的查询字符串 (%q) 的一部分。

上述信息将进入您指定的访问日志。如果您要求在发生错误时(且仅当)在错误日志中包含此信息:某些组件已经这样做了,但我不知道如何让它发生。当我收到错误并且没有给出 URL 时,我使用错误日志和访问日志中的时间戳来关联两者。

您可以为各种设施设置日志记录的粒度:请参阅Logging in Tomcat。这可以为您提供更多信息,这些信息可能与发生的任何错误相关,也可能不相关。

于 2010-08-23T21:54:20.400 回答