如何让Jersey 2.2(JAX-RS)生成日志输出,包括Json请求体
我在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配置如下所示:如何让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_对象令牌”在这一
<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));
}
}