在Tomcat的Catalina错误日志中显示URL

时间:2010-08-23 21:43:46

标签: java tomcat error-logging

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

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

GET和POST信息也很重要。

有可能吗?

2 个答案:

答案 0 :(得分: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);
}

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

将此Filter映射到/mywebservice中的web.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>

答案 1 :(得分: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"/> 

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

以上信息将进入您指定的访问日志。 如果您要求在错误日志中随时(并且仅在发生错误时)发生此信息:某些组件已经执行此操作,但我不知道如何实现此操作。当我收到错误并且没有给出URL时,我使用错误日志中的时间戳和访问日志来关联这两个。

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