2010-08-23 102 views
4

我对Java世界很陌生,我需要调试一个宁静的Javax Web服务应用程序。在Tomcat的Catalina错误日志中显示URL

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

GET和POST信息也是至关重要的。

可能吗?

回答

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映射到web.xml中的url-pattern如/mywebservice,以便它不会在其他请求上调用,而只会在您的Web服务上调用。

<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> 
+0

谢谢,它的工作原理,但它被称为每页访问。 有没有办法只在错误时触发它? – 2010-08-24 18:43:44

+0

如果您想获取请求主体(POST请求的数据),请使用'hsr.getReader()'(http://download.oracle.com/docs/cd/E17802_01/products/products/servlet/2.5 /docs/servlet-2_5-mr2/index.html)如果是字符数据。 – LarsH 2010-08-24 22:02:57

+1

@Mahoua:不幸的是,在这种情况下,Filter在请求执行前总是被触发,所以它不知道它是成功还是错误。 – JoseK 2010-08-25 06:40:54

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。这可以为您提供更多信息,这些信息可能与发生的任何错误相关,也可能不相关。

+0

这个数据将进入访问日志 - 我认为OP希望它在错误日志中记录与堆栈跟踪一起。所以他可以跟踪发件人的错误。 – JoseK 2010-08-24 04:28:41

+0

@JoseK感谢您的反馈。我更新了我的帖子,以反映出我能达到的程度。很高兴能从你的答案中学习。 – LarsH 2010-08-24 04:53:25

+0

@LarsH - 不客气:) – JoseK 2010-08-24 16:00:10

相关问题