Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让Jersey 2.2(JAX-RS)生成日志输出,包括Json请求体_Jersey_Jetty - Fatal编程技术网

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

如何让Jersey 2.2(JAX-RS)生成日志输出,包括Json请求体,jersey,jetty,Jersey,Jetty,我在Jetty 9.0.4中运行Jersey 2.2 Servlet,以服务REST请求 大多数情况下,一切都很好,请求都得到了满足,但我从未见过泽西岛课程的日志。我找不到任何文件表明我需要牺牲什么鸡来实现泽西2.2 所以我的第一个问题是-我需要做什么才能让Jersey生成一些日志 当请求确实运行错误时(例如,因为无法解析Json请求体),Jersey将抛出一个ContainerException,并显示类似于“无法反序列化java.util.ArrayList实例的START_对象令牌”在这一

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

大多数情况下,一切都很好,请求都得到了满足,但我从未见过泽西岛课程的日志。我找不到任何文件表明我需要牺牲什么鸡来实现泽西2.2

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

当请求确实运行错误时(例如,因为无法解析Json请求体),Jersey将抛出一个ContainerException,并显示类似于“无法反序列化java.util.ArrayList实例的START_对象令牌”在这一点上,记录传入的请求主体,以便我可以检查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>

泽西岛本身并没有多少木材。对于2.x,我们正在开发一种模式,其中包括跟踪支持(请参阅)、传入请求/传出响应的默认日志记录(包括实体主体和跟踪消息)。这项功能很快就会推出

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

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

ResourceConfig
实例(此处还演示了如何输出实体):


你希望/感激什么?我只对请求/响应感兴趣。但是,如果有一个日志表明Servlet已经启动并正在服务,那么至少可以保证日志记录工作正常。Michal,我尝试添加web.xml版本,但仍然没有记录请求。我已经更新了我的问题,加入了web.xml代码段。我也没有收到选项3的任何日志。您应该在
/logs/*.stderrout.log
中看到Jersey(在
INFO
级别)完成的一些日志,至少类似于
8月16日,2013年12:15:24 PM org.glassfish.jersey.server.ApplicationHandler初始化信息:启动jersey应用程序,版本jersey:2.3-SNAPSHOT 2013-08-14 18:36:24…
不是这样吗?我通过maven Jetty插件运行Jetty,所以没有Jetty\u主页。码头日志通常只进入System.out。我没有看到任何关于Jersey应用程序初始化的日志或任何其他Jersey日志(以下除外)。但是现在我已经在web.xml和MyApplication中配置了JerseyLogger:
8月16日,2013年8:28:41 PM org.glassfish.jersey.internal.Errors logErrors警告:已检测到以下警告:警告:无法为组件类型类org.glassfish.jersey.filter.LoggingFilter创建新注册:已找到该类型的现有以前注册。
我在这里感到非常愚蠢,但是Jetty的OOTB config只在INFO中记录Jetty日志,我将自己的类设置为在调试时记录,等等。配置Jetty使所有类在调试时记录显示Jersey日志。我有罪。
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));
    }
}
<init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>org.glassfish.jersey.filter.LoggingFilter</param-value>
</init-param>
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);
        }};
    }
}
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));
    }
}