我正在Jetty 9.0.4中运行一个Jersey 2.2 Servlet,以便为REST请求提供服务。
大多数情况下,一切都很好,请求也得到了满足,但我从未见过Jersey类的ANY日志。我找不到任何文件表明我需要牺牲什么鸡才能用Jersey 2.2 实现这一目标
所以我的第一个问题是——我需要做什么才能让Jersey生成一些日志。
当一个请求运行不正常时(例如,因为Json请求主体无法解析),Jersey会抛出一个ContainerException,并显示"can't deserialize instance of java.util.ArrayList out of START_OBECT token"等消息。此时,记录传入请求主体以便检查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本身并没有太多日志。对于2.x,我们正在开发开发模式,该模式将包括跟踪支持(请参阅泽西岛的跟踪)、传入请求/传出响应的默认日志记录(包括实体体和跟踪消息)。这个功能应该很快就会发布。
关于您的第二个问题-您可以注册LoggingFilter,它能够记录传入请求/传出响应(方法、标头等)以及实体体(配置时)。您可以通过配置它(第三个选项说明了如何打开实体日志):
web.xml
(将其添加到JAX-RSservlet定义中):
<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));
}
}