gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:05:17 25 4
gpt4 key购买 nike

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

大多数情况下一切都很好,请求得到了服务,但我从未见过 任何 来自 Jersey 的日志。而且我找不到任何说明我需要牺牲哪些鸡才能在 Jersey 2.2 中实现这一点的 doco

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

当请求确实运行出错时(例如,因为无法解析 Json 请求正文),Jersey 将抛出一个 ContainerException,其中包含“无法从 START_OBJECT token 中反序列化 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));
}
}

最佳答案

Jersey 本身并没有记录太多。对于 2.x,我们正在开发一种开发模式,该模式将包括跟踪支持(参见 Tracing in Jersey)、传入请求/传出响应的默认日志记录(包括实体主体和跟踪消息)。这个功能应该很快就会出来。

关于您的第二个问题-您可以注册LoggingFilter它能够记录传入请求/传出响应(方法、 header 等)以及实体主体(配置时)。您可以通过(第三个选项说明如何打开实体日志记录)进行配置:
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));
}
}

关于jersey - 如何让 Jersey 2.2 (JAX-RS) 生成日志输出,包括 Json 请求正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18268827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com