如何使用Spring MVC正确记录HTTP请求


问题内容

您好,我一直在尝试找出在应用程序中记录HTTP请求的通用方法,到目前为止还算不上好运,这是我现在处理日志的方式,即:

@RequestMapping(value="register", method = RequestMethod.POST)
    @ResponseBody
    public String register(@RequestParam(value="param1",required=false) String param1, @RequestParam("param2") String param2, @RequestParam("param3") String param3, HttpServletRequest request){
        long start = System.currentTimeMillis();
        logger.info("!--REQUEST START--!");

        logger.info("Request URL: " + request.getRequestURL().toString());

        List<String> requestParameterNames = Collections.list((Enumeration<String>)request.getParameterNames());
        logger.info("Parameter number: " + requestParameterNames.size());

 for (String parameterName : requestParameterNames){
           logger.info("Parameter name: " + parameterName + " - Parameter value: " + request.getParameter(parameterName));
        }
                  //Some processing logic, call to the various services/methods with different parameters, response is always String(Json)
        String response = service.callSomeServiceMethods(param1,param2,param3);

logger.info("Response is: " + response);

        long end = System.currentTimeMillis();
        logger.info("Requested completed in: " + (end-start) + "ms");
        logger.info("!--REQUEST END--!");

        return response;
    }

因此,我现在针对不同的控制器/方法所做的事情是,从方法内部的开始复制所有内容,直到不同方法的处理逻辑不同,然后从上方复制所有内容,如上面的模板所示。

这有点混乱,并且有很多代码重复(我不喜欢)。但是我需要记录所有内容。

有人在这种日志记录方面有更多经验吗,有人可以对此有所了解吗?


问题答案:

使用拦截器

  • 扩展HandlerInterceptorAdapter和覆盖preHandle
  • <mvc:interceptors>in 定义dispatcher-servlet.xml

它将针对每个请求运行。