如何让Jersey 2.2(JAX-RS)生成日志输出,包括Json请求体

时间:2013-08-16 08:16:06

标签: jersey jetty

我在Jetty 9.0.4中运行Jersey 2.2 Servlet以提供REST请求。

大多数情况下一切都很好并且请求得到了提供,但我从未见过来自Jersey类的 ANY 日志。而且我找不到任何doco表明我需要牺牲哪些鸡来实现泽西岛2.2

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

当请求确实运行错误时(例如因为无法解析Json请求体),Jersey将抛出一个ContainerException,其中包含“无法从START_OBJECT令牌中反序列化java.util.ArrayList实例”等消息。指出记录传入的请求体是否真的可爱,这样我就可以检查Json了。我再也找不到当前doco中描述这样一只野兽的东西,虽然我确定有一只。无论如何,直到我解决上面的问题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));
    }
}

1 个答案:

答案 0 :(得分:13)

泽西岛本身并没有多少记录。对于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));
    }
}