How to get jersey logs at server?

后端 未结 5 1304
时光取名叫无心
时光取名叫无心 2020-11-28 05:36

I am using jersey for a REST WS. How do I enable jersey logs at server side?

Long story: I get a clientside exception - but I don\'t see anything in tomcat logs [It

相关标签:
5条回答
  • 2020-11-28 05:48

    Jersey 2.0 uses org.glassfish.jersey.filter.LoggingFilter
    You can connect it with help of 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>
    

    More explanations can be found here

    upd:

    After version 2.23 LoggingFilter is deprecated and LoggingFeature should be used. More info can be found in official documentation

    0 讨论(0)
  • 2020-11-28 05:48

    Could you show us your client code and tell us about the request as well?

    This exception seems to point at the JAXB unmarshalling step. Apparently you received some XML from your REST API, but you don't get what you're waiting for.

    Maybe the XSD you're using for marshalling/unmarshalling is outdated or just plain wrong.
    Maybe you're trying to get the wrong entity from the response.

    Try these steps and give us some more details about your problem:

    Get the XML from the response

    Using a REST client like Client REST simple (a chrome extension), or your code:

    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);
    

    Validate this XML with the XSD you're using

    This test should fail (if I'm right).

    0 讨论(0)
  • 2020-11-28 05:54

    If you want to turn on logging on the server side, you need to register the LoggingFilter Jersey filter (on the container side).

    This filter will log request/response headers and entities.

    Here's what you need to add to your ResourceConfig class:

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

    Note that the same filter also works on the client side.

    Client client = Client.create();
    client.addFilter(new LoggingFilter());
    
    0 讨论(0)
  • 2020-11-28 06:01

    Jersey 2 has deprecated LoggingFilter and you now need to use LoggingFeature. In order to use it with a client you can use the following snipette:

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

    and on the server side:

    ResourceConfig config = new ResourceConfig(HelloWorldResource.class);
    config.register(LoggingFeature.class);
    
    0 讨论(0)
  • 2020-11-28 06:01

    For Jersey 1.2 add the following entry into web.xml inside the servlet tag:

        <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>
    
    0 讨论(0)
提交回复
热议问题