【问题标题】:How can I log requests for unknown URL endpoints in Spring Boot?如何在 Spring Boot 中记录对未知 URL 端点的请求?
【发布时间】:2018-10-05 22:10:19
【问题描述】:

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

我尝试在调用 super 并将 ServletContext 传递到链上之前覆盖该方法并添加一个过滤器,但这也不起作用。

servletContext.addFilter("CommonsRequestLoggingFilter",
            CommonsRequestLoggingFilter.class)
    .addMappingForServletNames(null, false, "myApp");
    super.onStartup(servletContext);

我有点迷茫。我在这里做错了什么? (可能一切)。

【问题讨论】:

  • 您不能使用记录器过滤器并保存每个请求,无论是 200 还是 400,都必须保存在数据库中,然后您可以从那里检索它。
  • 那是我的问题,我不知道。我应该在哪里查找这些信息?

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


【解决方案1】:

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

【讨论】:

  • 嗯...是的,我今天早些时候按照本教程尝试过:javadevjournal.com/spring/log-incoming-requests-spring 但我的任何日志文件中都没有收到任何消息。
  • 您是否在过滤器中放置了一个断点来验证您的方法是否被调用?你的bean创建了吗?会不会是日志配置问题?
  • 刚刚试了一下,bean 正在创建中。可能是日志记录配置问题。这是一个在wildfly实例中运行的spring boot应用程序,tomcat中的构建不包含在包中。
【解决方案2】:

尝试在您的 WebMvcConfigurer 上添加自定义 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 {              
            }

        });

    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 2018-12-02
    • 2019-04-11
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多