【问题标题】:How can I log RESTful post data?如何记录 RESTful 发布数据?
【发布时间】:2012-09-11 13:45:00
【问题描述】:

我们通过 Spring MVC 公开了 REST 服务。我们使用HandlerExceptionResolver 来记录异常。我们目前记录以下内容:

  • 异常及其堆栈跟踪
  • 网址
  • 请求标头

如果我们也可以记录 JSON 发布数据,那么调试会更容易。关于如何获得这个有什么建议吗?

【问题讨论】:

    标签: java spring rest logging


    【解决方案1】:

    将此添加到代表应用程序配置的类中:

    import javax.servlet.Filter;
    import javax.servlet.http.HttpServletRequest;
    import org.springframework.web.filter.AbstractRequestLoggingFilter;
    

    ....

    @Bean
    public Filter loggingFilter(){
        AbstractRequestLoggingFilter f = new AbstractRequestLoggingFilter() {
    
            @Override
            protected void beforeRequest(HttpServletRequest request, String message) {
                System.out.println("beforeRequest: " +message);
            }
    
            @Override
            protected void afterRequest(HttpServletRequest request, String message) {
                System.out.println("afterRequest: " +message);
            }
        };
        f.setIncludeClientInfo(true);
        f.setIncludePayload(true);
        f.setIncludeQueryString(true);
    
        f.setBeforeMessagePrefix("BEFORE REQUEST  [");
        f.setAfterMessagePrefix("AFTER REQUEST    [");
        f.setAfterMessageSuffix("]\n");
        return f;
    }
    

    你可能需要注释掉

       f.setIncludePayload(true);
    

    【讨论】:

      【解决方案2】:

      您需要一个过滤器,以便在读取请求正文时保存它,并稍后将保存的数据提供给您的异常记录器。

      Spring 包含做类似事情的AbstractRequestLoggingFilter。虽然它并不直接适合您的问题,但您可以将其作为参考来实现您自己的过滤器。

      【讨论】:

      • 如果您使用的是 Spring 4.1.3+(请参阅 SPR-12477),请确保将您的过滤器映射到您的 MVC Dispatcher Servlet 而不是 <url-pattern>/*</url-pattern>,否则您的请求将无法获得包裹在基本的ContentCachingRequestWrapper中。
      • @LászlóvandenHoek,您能详细说明一下吗?我不跟着你。我使用的是ContentCachingRequestWrapper,但请求正文始终为空字符串。
      • @AbhijithMadhav 过滤器通过将它们映射到 URL 模式或 servlet 来启用。我的意思是您需要确保将您的 AbstractRequestLoggingFilter 映射到您的调度程序,而不是 /* URL 模式。
      【解决方案3】:

      没有简单的方法来记录请求/响应的负载。您可以使用 java web 过滤器拦截所有请求和响应,并从流中读取 JSON 数据。但是有一个问题,当您从流中读取数据时,实际数据将从流中耗尽。

      因此,您必须实现实际请求和响应对象的包装器。只会记录请求响应的复制版本。我们已经实现了类似的解决方案,如下所示,它满足了我们的要求:

      http://www.wetfeetblog.com/servlet-filer-to-log-request-and-response-details-and-payload/431

      http://angelborroy.wordpress.com/2009/03/04/dump-request-and-response-using-javaxservletfilter/

      【讨论】:

      • 第一个链接 (wetfeetblog) 被企业安全报告感染了 js 病毒,第二个链接截至 2020 年 1 月已失效。
      • 第一个链接没用。但第二个链接有效。
      猜你喜欢
      • 2011-04-24
      • 1970-01-01
      • 2018-12-23
      • 2016-09-30
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 2014-06-21
      • 1970-01-01
      相关资源
      最近更新 更多