在 SpringMVC 中启用日志记录,而不是使用 Spring-boot

我正在创建一个简单的 SpringMVC 项目,并且想要记录所有传入请求,包括 uri/query/payload/clientIp... ,所有信息。

我能找到的所有资源都是关于 Spring Boot 的,例如: https ://www.javadevjournal.com/spring/log-incoming-requests-spring/

我还阅读了官方文档并找到了enableLoggingRequestDetails选项,但没有关于它的详细信息,我尝试过但没有工作。 https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-logging

那么,如何在纯 SpringMVC 框架(没有 Spring Boot)中实现这一点呢?

SpringMVC 是否有内置方法可以做到这一点?


茅侃侃
浏览 144回答 3
3回答

慕容3067478

1.您可以实现一个从OncePerRequestFilter扩展的Filter类,然后每个请求都会经过您的过滤器。然后你可以在这个类中记录你想要的内容。   @Slf4j    @Component    public class RequestLoggingFilter extends OncePerRequestFilter {        @Override        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {            log.debug(                    String.format("FILTERED URL: %s", request.getRequestURI())            );            //continue filtering            filterChain.doFilter(request, response);        }    }2.另一种方法是实现一个继承自HandlerInterceptorAdapter的 Interceptor 类。    @Slf4j    @Component    public class RequestLoggingHandler extends HandlerInterceptorAdapter {        @Override        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {            log.debug(                    String.format("HANDLER(pre) URL: %s", request.getRequestURI())            );            return super.preHandle(request, response, handler);        }        @Override        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {            log.debug(                    String.format("HANDLER(post) URL: %s", request.getRequestURI())            );            super.postHandle(request, response, handler, modelAndView);        }    }但是您必须通过显式配置添加它来启用此拦截器。    @Configuration    public class WebApplicationConfiguration implements WebMvcConfigurer {        @Setter(onMethod_ = @Autowired)        private RequestLoggingHandler requestLogger;        @Override        public void addInterceptors(InterceptorRegistry registry) {            registry.addInterceptor(requestLogger);        }    }3.另一种方法是使用标准CommonsRequestLoggingFilter。这样你应该使用如下配置来配置它:@Configurationpublic class RequestLoggingFilterConfig {    @Bean    public CommonsRequestLoggingFilter logFilter() {        CommonsRequestLoggingFilter filter          = new CommonsRequestLoggingFilter();        filter.setIncludeQueryString(true);        filter.setIncludePayload(true);        filter.setMaxPayloadLength(10000);        filter.setIncludeHeaders(false);        filter.setAfterMessagePrefix("REQUEST DATA : ");        return filter;    }}然后在 logback.xml 中启用它:<logger name="org.springframework.web.filter.CommonsRequestLoggingFilter">    <level value="DEBUG" /></logger>

倚天杖

使用CommonsRequestLoggingFilterSpring MVC 提供了 CommonsRequestLoggingFilter ,可以记录请求 URL、正文等相关信息。Commons请求日志过滤器LoggingConfig.javaimport ch.qos.logback.classic.Level;import ch.qos.logback.classic.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;import org.springframework.core.env.Environment;@Configuration@PropertySource("classpath:logging.properties")public class LoggingConfig {    @Autowired    private Environment env;    public CommonsRequestLoggingFilter requestLoggingFilter() {        CommonsRequestLoggingFilter loggingFilter = new CommonsRequestLoggingFilter();        loggingFilter.setIncludeClientInfo(env.getProperty("logging.client"));        loggingFilter.setIncludeQueryString(env.getProperty("logging.query"));        loggingFilter.setIncludePayload(env.getProperty("logging.payload"));        loggingFilter.setIncludeHeaders(env.getProperty("logging.headers"));        return loggingFilter;    }    @Bean    public CommonsRequestLoggingFilter springLogging() {        Logger logger = (Logger) LoggerFactory.getLogger(CommonsRequestLoggingFilter.class);                logger.setLevel(Level.DEBUG);        return requestLoggingFilter();    }}logging.propertieslogging.client = truelogging.query = truelogging.payload = truelogging.headers = true

摇曳的蔷薇

为了在 Spring 应用程序中启用日志记录,您需要做的是日志库及其属性文件要使 Log4j 使用默认的 JCL 依赖项(commons-logging),您需要做的就是将 Log4j 放在类路径上,并为其提供配置文件(类路径根目录中的 log4j.properties 或 log4j.xml)。<dependency>      <groupId>log4j</groupId>      <artifactId>log4j</artifactId>      <version>1.2.14</version>      <scope>runtime</scope>   </dependency>log4j.propertieslog4j.rootCategory=INFO, stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%nlog4j.category.org.springframework.beans.factory=DEBUG
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java