猿问

如何在用于日志记录的侦听器中获取控制器类名

在我的 springboot 应用程序中,我们使用 and 记录控制器请求/响应。有关示例代码,请参阅下面的链接。org.springframework.web.util.ContentCachingRequestWrapperorg.springframework.web.util.ContentCachingResponseWrapper


自定义日志过滤器 :


https://stackoverflow.com/a/42023374/1958669


在应用程序中有一个存在。现在的问题是在记录它的唯一拦截器名称时 className 。因此,为了获取实际控制器名称,我尝试在拦截器中获取类名。但这给出了.interceptororg.springframework.web.util.ContentCachingRequestWrapper


CustomWebMvcConfig :


@Configuration

public class CustomWebMvcConfig implements WebMvcConfigurer {


    @Override

    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(new CustomLogInterceptor());

    }

}

自定义日志接收器 :


public class CustomLogInterceptor extends HandlerInterceptorAdapter {

    private static final Logger logger = LogManager.getLogger(CustomLogInterceptor.class);


    @Override

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        return true;

    }


    @Override

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

        //Some operation

    }

}

获取以下格式的日志:


time=“2019-03-18T09:59:51,001Z”, thread=“[o-auto-1exec-]” ,class=“a.b.c.CustomLoggingFilter ”,message=“Payload_1”


time=“2019-03-18T09:59:51,001Z”, thread=“[o-auto-1-xec-1]” ,class=“a.b.c.CustomLoggingFilter ”,message=“Payload_2””


我的问题是如何在日志中获取实际的 ControllerClass 名称,而不是 LoggingFilterClass(一个使用org.springframework.web.util.ContentCachingRequestWrapper)


Qyouu
浏览 90回答 1
1回答

米脂

您可以尝试使用:HandlerMethod handlerMethod = (HandlerMethod) handler;String controllerName = handlerMethod.getBeanType().getSimpleName().replace("Controller", "");或者,如果要打印 URI:request.getRequestURI();我认为您无法更改记录器,因为您不知道谁将成为控制器。
随时随地看视频慕课网APP

相关分类

Java
我要回答