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


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

大多数情况下一切都很好,请求得到满足,但我从未见过 任何 从Jersey课程登录。而且我找不到任何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));
    }
}

4528
2017-08-16 08:16


起源

什么 泽西岛班 你会期待/欣赏日志吗? - Michal Gajdos
我真的只对请求/响应感兴趣。但是有了一个表明Servlet已启动并正在服务的日志,至少可以确保日志记录正常运行。 - William


答案:


泽西岛本身并没有多少记录。对于2.x我们正在努力 发展模式 其中包括追踪支持(见 追踪泽西岛),传入请求/传出响应的默认日志记录(包括实体主体和跟踪消息)。这个功能应该很快就会出来。

关于你的第二个问题 - 你可以注册 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));
    }
}

13
2017-08-16 08:52



Michal,我尝试添加web.xml版本,但我仍然没有记录请求。我已更新我的问题以包含web.xml片段 - William
我也没有获得选项3的任何日志。 - William
你应该看看Jersey做的一些日志(at INFO 等级) <jetty_home>/logs/*.stderrout.log,至少是这样的 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... 不是这样的吗? - Michal Gajdos
我通过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. - William
我觉得这里真的很蠢,但Jetty的OOTB配置只记录INFO的Jetty日志,我设置自己的类来登录DEBUG等。配置Jetty以便所有登录DEBUG的类显示Jersey日志。 Mea culpa。 - William