【问题标题】:How do I get Jersey 2.5.1 on tomcat to log request/response including entities (request/response body)如何在 tomcat 上获取 Jersey 2.5.1 以记录请求/响应,包括实体(请求/响应正文)
【发布时间】:2014-02-15 05:07:04
【问题描述】:

我在 tomcat 上部署了 Jersey 2.5.1 应用程序。我在 web.xml 中添加了以下配置:

<init-param>
  <param-name>jersey.config.server.provider.classnames</param-name>
  <param-value>org.glassfish.jersey.filter.LoggingFilter</param-value>
</init-param>

它正在打印请求和响应标头。但是,它不会在响应中打印请求/响应实体/正文。

我尝试使用不同的参数但没有运气,例如:

INFO: 1 * Server has received a request on thread http-bio-8080-exec-3
1 > accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
1 > accept-encoding: gzip,deflate,sdch
1 > accept-language: en-US,en;q=0.8
1 > cache-control: no-cache
1 > connection: keep-alive
1 > cookie: JSESSIONID=1F5CCACA7DF2EABA9475C270A95C91B2
1 > host: localhost:8080
1 > pragma: no-cache
1 > user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36


Jan 24, 2014 1:01:31 AM org.glassfish.jersey.filter.LoggingFilter log
INFO: 1 * Server responded with a response on thread http-bio-8080-exec-3
1 < 200
1 < Content-Type: application/json

感谢您的回答。看起来我在上面粘贴了错误的配置。这是我的 web.xml 中的内容:

  <servlet>
    <servlet-name>jersey-servlet</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>com.my.package.web.resources;org.codehaus.jackson.jaxrs</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>org.glassfish.jersey.filter.LoggingFilter</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.tracing</param-name>
        <param-value>ALL</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>jersey-servlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>

它记录标题。但它不记录实体。这是我在日志中看到的:

Jan 28, 2014 2:36:38 PM org.glassfish.jersey.filter.LoggingFilter log
INFO: 5 * Server has received a request on thread http-bio-8080-exec-10
5 > GET http://localhost:8080/sample/api/foo
5 > accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
5 > accept-encoding: gzip,deflate,sdch
5 > accept-language: en-US,en;q=0.8
5 > cache-control: max-age=0
5 > connection: keep-alive
5 > cookie: JSESSIONID=1F5CCACA7DF2EABA9475C270A95C91B2
5 > host: localhost:8080
5 > user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36

Jan 28, 2014 2:36:38 PM Jan 28, 2014 2:36:38 PM org.glassfish.jersey.filter.LoggingFilter log
INFO: 5 * Server responded with a response on thread http-bio-8080-exec-10
5 < 200
5 < Content-Type: application/json

我的 Jersey 应用程序部署在 Tomcat 7_50 服务器上。

如果我在 web.xml 中使用 init-param 配置了跟踪和日志过滤器。我还需要使用 Recource Config 注册它吗?

public class MyApplication 扩展 ResourceConfig 如下:

    public MyApplication() {
        // Register resources and providers using package-scanning.
        packages("my.package");

        // Register my custom provider - not needed if it's in my.package.
        register(SecurityRequestFilter.class);
        // Register an instance of LoggingFilter.
        register(new LoggingFilter(LOGGER, true));

        // Enable Tracing support.
        property(ServerProperties.TRACING, "ALL");
    }
}

【问题讨论】:

    标签: tomcat jersey-2.0


    【解决方案1】:

    您可以按照 Lokesh Gupta 的 instructions 创建一个 CustomLoggingFilter.java

    不过,我最终注册过滤器的方式略有不同:

    public class MyApplication extends Application {
        @Override
        public Set<Class<?>> getClasses() {
            final Set<Class<?>> classes = new HashSet<>();
            classes.addAll(super.getClasses());
            classes.add(CustomLoggingFilter.class);
            return classes;
        }
    }
    

    在您的web.xml 中注册您的MyApplication.java

    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>org.something.MyApplication</param-value>
    </init-param>
    

    【讨论】:

    • 嗨,我也差不多。但我无法以 Json 格式打印它。有什么见解吗?谢谢
    【解决方案2】:
    1. 您无法在 web.xml 中进行配置。
    2. 您正在混合 2 个版本的 Jersey(web.xml 中的 init-params 来自 Jersey 1 - com.sun.jersey 包前缀)
    3. 查看Registering Resources and Providers in Jersey 2,您可以在那里找到如何注册LoggingFilter 以确保实体也被记录。

    【讨论】:

    • 请看下面我的cmets:
    • 提供的链接 3. 包含无法编译的代码并且其中有一些令人困惑的错误。我觉得它不是很有用。
    • follow 3,我仍然无法记录实体。还有更多帮助吗?
    猜你喜欢
    • 2017-12-18
    • 1970-01-01
    • 2017-05-19
    • 2021-07-21
    • 2012-02-08
    • 2019-01-10
    • 2019-05-17
    • 1970-01-01
    • 2019-02-17
    相关资源
    最近更新 更多