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

2022-09-01 02:24:30

您好,我一直在尝试找出在我的应用程序中记录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;
    }

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

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

有没有人对这种日志记录有更多经验,任何人都可以对此进行一些阐明吗?


答案 1

编辑:另外,请参阅@membersound对此答案的评论,该评论改进了此答案。

弹簧支持这一点。参见CommonsRequestLoggingFilter。如果使用Spring Boot,只需注册该类型的Bean,Boot就会将其应用于过滤器链。喜欢:

@Bean
public Filter logFilter() {
    CommonsRequestLoggingFilter filter = new CommonsRequestLoggingFilter();
    filter.setIncludeQueryString(true);
    filter.setIncludePayload(true);
    filter.setMaxPayloadLength(5120);
    return filter;
}

此外,此日志记录筛选器要求将日志级别设置为 DEBUG。例如,在日志中执行此操作.xml使用:

<logger name="org.springframework.web.filter.CommonsRequestLoggingFilter" level="DEBUG"/>

答案 2

使用拦截器

  • 扩展和覆盖HandlerInterceptorAdapterpreHandle
  • 用 in 定义它<mvc:interceptors>dispatcher-servlet.xml

它将针对每个请求运行。


推荐