【问题标题】:How do I get Jersey 2.2 (JAX-RS) to generate log output, including Json request bodies如何让 Jersey 2.2 (JAX-RS) 生成日志输出,包括 Json 请求正文
【发布时间】:2013-08-16 08:16:06
【问题描述】:

我在 Jetty 9.0.4 中运行 Jersey 2.2 Servlet 以服务 REST 请求。

大多数情况下一切都很好,请求得到了服务,但我从未见过 Jersey 课程的 ANY 日志。而且我找不到任何说明我需要牺牲哪些鸡才能在 Jersey 2.2 上实现这一目标的文档

所以我的第一个问题是 - 我需要做什么才能让 Jersey 生成一些日志。

当请求确实运行出错时(例如,因为无法解析 Json 请求正文)Jersey 将抛出 ContainerException 并带有类似“无法反序列化 java.util.ArrayList 的实例出 START_OBJECT 令牌”等消息。指出真的很高兴记录传入的请求正文,以便我可以检查 Json。我再一次在当前的文档中找不到任何概述这种野兽的东西,尽管我确信有一个。无论如何,在我解决上面的问题 1 之前,它都没有实际意义。

所以我的第二个问题是如何记录传入的请求正文(不中断请求)。

web.xml 中的 Jersey Servlet 配置如下所示:

<servlet >
    <servlet-name>Jersey Servlet</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>au.com.xandar.wirelesstiming.recorder.web.rest.JerseyApplication</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>
    <load-on-startup>1</load-on-startup>
</servlet>

我的 JerseyApplication 是:

public final class JerseyApplication extends ResourceConfig {

    public JerseyApplication() {
        super(
            //JacksonFeature.class   // Switching on Jackson
            // (My) JerseyLoggingFilter.class       // Log requests using Jersey ContainerRequestFilter 
            MyApplicationEventListener.class        // Log Requests using Jersey RequestEventListener
        );
        packages("au.com.xandar.wirelesstiming.recorder");

        // Enable LoggingFilter & output entity.
        // NB This does NOT generate any log.
        registerInstances(new LoggingFilter(Logger.getLogger(JerseyApplication.class.getName()), true));
    }
}

【问题讨论】:

  • 您希望/欣赏哪些Jersey classes日志?
  • 我真的只对请求/响应感兴趣。但是如果有日志表明 Servlet 已经启动并正在服务,至少可以确保日志记录正常工作。

标签: jersey jetty


【解决方案1】:

Jersey 本身不会记录太多日志。对于 2.x,我们正在开发一种开发模式,其中包括跟踪支持(请参阅Tracing in Jersey)、传入请求/传出响应的默认日志记录(包括实体主体和跟踪消息)。此功能应该很快就会推出。

关于您的第二个问题 - 您可以注册 LoggingFilter,它能够记录传入请求/传出响应(方法、标头等)以及实体主体(配置时)。您可以通过以下方式进行配置(第 3 个选项说明了如何打开实体日志记录):

web.xml(将其添加到 JAX-RS servlet 定义中):

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

Application分机:

public class MyApplication extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        return new HashSet<Class<?>>() {{
            // Add your resources.
            add(HelloWorldResource.class);

            // Add LoggingFilter.
            add(LoggingFilter.class);
        }};
    }
}

ResourceConfig 实例(演示也在这里输出实体):

public class MyApplication extends ResourceConfig {

    public MyApplication() {
        // Resources - add your package name here to enable package scanning.
        packages(...);

        // Enable LoggingFilter & output entity.     
        registerInstances(new LoggingFilter(Logger.getLogger(MyApplication.class.getName()), true));
    }
}

【讨论】:

  • Michal,我尝试添加 web.xml 版本,但仍然没有记录请求。我已经更新了我的问题以包含 web.xml sn-p
  • 我也没有得到选项 3 的任何日志。
  • 你应该在&lt;jetty_home&gt;/logs/*.stderrout.log 中看到Jersey(INFO 级别)完成的一些日志,至少类似于Aug 16, 2013 12:15:24 PM org.glassfish.jersey.server.ApplicationHandler initialize INFO: Initiating Jersey application, version Jersey: 2.3-SNAPSHOT 2013-08-14 18:36:24... 不是这样吗?
  • 我通过 maven-jetty-plugin 运行 Jetty,所以没有 jetty_home。 Jetty 日志通常只是转到 System.out。我没有看到任何关于 Jersey 应用程序初始化的日志或任何其他 Jersey 日志(以下除外)。但是现在我在 web.xml 和 MyApplication 中都配置了 JerseyLogger,我得到了:Aug 16, 2013 8:28:41 PM org.glassfish.jersey.internal.Errors logErrors WARNING: The following warnings have been detected: WARNING: Cannot new create registration for component type class org.glassfish.jersey.filter.LoggingFilter: Existing previous registration found for the type.
  • 我觉得这里真的很愚蠢,但是 Jetty 的 OOTB 配置仅在 INFO 记录 Jetty 日志,我将自己的类设置为在 DEBUG 等处登录。配置 Jetty 以便所有类在 DEBUG 中记录显示 Jersey 日志.过失。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 2016-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
  • 2012-06-29
相关资源
最近更新 更多