如何在Spring Boot中记录对未知URL端点的请求?

时间:2018-04-25 12:17:43

标签: java spring spring-boot logging servlet-filters

我有一个使用SpringBootServletInitializer的Spring Boot应用程序 在我的Controller中,我有多个端点,这些端点根据URL中包含的参数进行区分,如下所示:

@RequestMapping(value = "myEndpoint", method = RequestMethod.GET, params = { "Id", "name", "petType" })
public void get(@RequestParam String id, @RequestParam String name,  @RequestParam String petType){
   //do stuff
} 

@RequestMapping(value = "myEndpoint", method = RequestMethod.GET, params = { "Id", "name"})
public void get(@RequestParam String id, @RequestParam String name){
   //do stuff
} 

@RequestMapping标记中包含params意味着如果缺少params,则会将响应发送回客户端,使得请求告诉他们错误;但是,服务器端没有记录任何内容 我想实现日志记录,因此如果向/myEndpoint发出缺少参数的请求,则它会显示在服务器日志中。 像原始请求的url和params之类的东西。 为此,我遇到了this spring tutorial,我试图实现它。但是我遇到了一个问题,即教程实现了扩展CustomWebAppInitializer的{​​{1}},我的应用已扩展WebApplicationInitalizer。 当我尝试实现两者时,我得到一个错误,因为SpringBoot已经已经由SpringBootServletInitializer初始化了上下文根。
当我尝试覆盖SpringBootServletInitializer中的onStartup()方法时,它似乎可以正常工作,但是我的应用程序未正确初始化,无法从浏览器访问。

我尝试重写该方法并在调用super之前添加一个过滤器并将SpringBootServletInitializer传递回链,但这也不起作用。

ServletContext

我有点失落。我在这做错了什么? (可能一切)。

2 个答案:

答案 0 :(得分:0)

由于Spring Boot已经设置了上下文,因此您不需要使用CustomWebAppInitializer。您只需要在Configuration类中为CommonsRequestLoggingFilter声明一个bean。如果行为不能满足您的需求,您可以实现javax.servlet.Filter并为您的实现声明一个bean。

答案 1 :(得分:0)

尝试在WebMvcConfigurer上添加Custom HandlerInterceptor以进行日志记录。

@Configuration
public class HttpRequestInterceptorConfigurer implements WebMvcConfigurer {

    private static Logger LOG = Logger.getLogger(HttpRequestInterceptorConfigurer.class);

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new HandlerInterceptor() {

            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                LOG.info("URI : " +request.getRequestURI() +" - QueryStr : " +request.getQueryString());
                return true;
            }

            @Override
            public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            }

            @Override
            public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {              
            }

        });

    }

}