【问题标题】:How to get jersey logs at server?如何在服务器上获取球衣日志?
【发布时间】:2010-02-25 08:10:41
【问题描述】:

我将球衣用于 REST WS。如何在服务器端启用球衣日志?

长篇大论: 我得到一个客户端异常 - 但我在 tomcat 日志中看不到任何内容[它甚至没有达到我的方法]。由于堆栈跟踪说“toReturnValue”它确实从服务器获得了一些东西。但我不知道服务器说了什么。

Exception in thread "main" java.lang.IllegalArgumentException: source parameter must not be null
 at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:98)
        at com.sun.xml.internal.ws.message.AbstractMessageImpl.readPayloadAsJAXB(AbstractMessageImpl.java:100)
        **at com.sun.xml.internal.ws.client.dispatch.JAXBDispatch.toReturnValue(JAXBDispatch.java:74)**
        at com.sun.xml.internal.ws.client.dispatch.DispatchImpl.doInvoke(DispatchImpl.java:191)
        at com.sun.xml.internal.ws.client.dispatch.DispatchImpl.invoke(DispatchImpl.java:195)

【问题讨论】:

    标签: java jersey


    【解决方案1】:

    如果要在服务器端开启日志,需要注册LoggingFilter Jersey filter(在容器端)。

    此过滤器将记录请求/响应标头和实体

    这是您需要添加到 ResourceConfig 类的内容:

    @ApplicationPath("/")
    public class MyApplication extends ResourceConfig {
    
        public MyApplication() {
            // Resources.
            packages(MyResource.class.getPackage().getName());
    
            register(LoggingFilter.class);    
        }
    }
    

    请注意,相同的过滤器也适用于客户端。

    Client client = Client.create();
    client.addFilter(new LoggingFilter());
    

    【讨论】:

    • 为什么这两个 init-params 相同,还是我遗漏了一些区别?
    • @AlperAkture 第一个是 ContainerREQUESTFilters,第二个是 ContainerRESPONSEFilters
    • 啊,明白了,我想我需要眼镜,完全错过了。谢谢。
    • 这对我有用...客户端/服务器日志都被截获...此外,您可以使用命令行/Eclipse Debug config 使用 maven.tomcat.webXml=src/ 对其进行调试main/webapp/config/web.xml 以防你使用 tomcat。
    • 新版本的 jersey 2.x 是 client.register(LoggingFilter.class);
    【解决方案2】:

    Jersey 2 已弃用 LoggingFilter,您现在需要使用 LoggingFeature。为了将它与客户端一起使用,您可以使用以下代码片段:

    this.client = ClientBuilder
                .newBuilder()
                .property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_CLIENT, LoggingFeature.Verbosity.PAYLOAD_ANY)
                .property(LoggingFeature.LOGGING_FEATURE_LOGGER_LEVEL_CLIENT, "WARNING")
                .build();
    

    在服务器端:

    ResourceConfig config = new ResourceConfig(HelloWorldResource.class);
    config.register(LoggingFeature.class);
    

    【讨论】:

    • LoggingFeature 从 2.23 开始使用,LoggingFilter 在此之前仍在使用。
    【解决方案3】:

    Jersey 2.0 使用 org.glassfish.jersey.filter.LoggingFilter
    您可以在 web.xml

    的帮助下连接它
    <!-- Register my custom provider (not needed if it's in my.package) AND LoggingFilter. -->
            <init-param>
                <param-name>jersey.config.server.provider.classnames</param-name>
                <param-value>org.glassfish.jersey.filter.LoggingFilter</param-value>
            </init-param>
    

    更多解释可见here

    更新:

    2.23 版本之后,LoggingFilter 已弃用,应使用LoggingFeature。 更多信息可以在official documentation找到。

    【讨论】:

      【解决方案4】:

      对于 Jersey 1.2,将以下条目添加到 servlet 标记内的 web.xml

          <init-param>
              <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
              <param-value>com.sun.jersey.api.container.filter.LoggingFilter</param-value>
          </init-param>
      

      【讨论】:

      • 能否请您提一下日志文件的位置?
      • 这取决于您如何以及是否配置了日志记录。您可以查找 log4j.xml 或 log4j.properties,...默认情况下,日志记录仅打印在 System.out 上。
      【解决方案5】:

      您能否向我们展示您的客户端代码并告诉我们有关请求的信息?

      此异常似乎指向 JAXB 解组步骤。显然,您从 REST API 收到了一些 XML,但没有得到您正在等待的内容。

      也许您用于编组/解组的 XSD 已过时或完全错误。
      也许您正试图从响应中获取错误的实体。

      尝试这些步骤,并为我们提供有关您的问题的更多详细信息:

      从响应中获取 XML

      使用 REST 客户端,如 Client REST simple(Chrome 扩展)或您的代码:

      Builder builder = webResource.path("/yourapi/").accept("application/xml");
      
      // get the client response
      ClientResponse response = builder.get(ClientResponse.class);
      
      // log the HTTP Status
      logger.log("HTTP Status: " + response.getStatus());
      
      // bypass the jaxb step and get the full response
      // MyResource myResource = response.getEntity(MyResource.class);
      String myResource = response.getEntity(String.class);
      logger.log(myResource);
      

      使用您正在使用的 XSD 验证此 XML

      这个测试应该失败(如果我是对的)。

      【讨论】:

      • 感谢布赖恩。此特定问题是由于 URI 的无效构造造成的。我做了类似[看看突变]localhost/blah/http://localhost/blah的东西。它击中服务器,服务器返回错误代码,客户端由于库未处理 null 而失败。 com.sun.xml.internal.ws.message.AbstractMessageImpl:107 返回 (T) unmarshaller.unmarshal(readPayloadAsSource()); readPayloadAsSource() 返回 null。所以例外信息更多的是红鲱鱼。我主要想知道如何在服务器上获取球衣日志——这样我才能知道返回的是什么服务器。
      • 嘿法克鲁丁。你真的应该编辑你的问题以明确这一点。我添加了另一个答案(我希望这个答案能回答您的问题)。
      • 谢谢!这就是我要找的。顺便说一句,我认为我的第一行说 [“如何在服务器端启用球衣日志?”] 我想要什么。
      • 同意。但是随后您详细说明了客户端的 JAXB 问题 - 这就是为什么我在提交第一个答案时认为自己走在正确的道路上。不过不要误会我的意思,我认为问题和答案都是相关的(并且可能对球衣用户有用) - 重写其中的一部分可以帮助其他人。
      • @Brian 我在 web.xml 中添加了 init-param,我得到了标题,但没有得到实际的请求/响应正文。我有什么遗漏吗?
      猜你喜欢
      • 2015-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      相关资源
      最近更新 更多