How to enable logging for @RestController?

java, rest, spring, web-services

Solution

You can just enable log4j org.springframework.security if you are using spring security, but it's very verbose:

<category name="org.springframework.security">
   <priority value="ALL" />
</category>

Or you can implement an interceptor:

public class LoggerInterceptor extends HandlerInterceptorAdapter {    
    private static final Logger logger = LoggerFactory.getLogger(LoggerInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        logger.info("pre hangle URI: " + request.getRequestURI());

        return super.preHandle(request, response, handler);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        logger.info("post hangle URI: " + request.getRequestURI());

        super.afterCompletion(request, response, handler, ex);
    }    
}

applicationContext.xml

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**" />
        <bean class="com.mycompany.LoggerInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

Problem

How can I automatically log any incoming `GET` url requests on a `REST` service written with `Spring`? ``` @RestController public class MyRest { @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_XML_VALUE) @ResponseBody public ComplexRsp test() { //... } } ``` I have used `cxf` for `soap`, where logging is as easy as annotation the webservice with `@InInterceptors, @OutInterceptors`. Is there anything similar in spring for rest?

Original source

Related problems