我正在创建一个简单的SpringMVC项目,并希望记录所有传入的请求,包括uri/query/payload/clientIp.全部信息。
我能找到的所有资源都是关于Spring的,例如: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 )中实现这一点呢?
是否有一个内置的SpringMVC方法来做这件事?
发布于 2019-09-29 07:58:42
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);
}
}CommonsRequestLoggingFilter. 3. 3.的另一种方法是使用标准的
这样,您应该使用配置来配置它,如下所示:
@Configuration
public 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>发布于 2019-09-29 08:04:25
为了在Spring应用程序中启用日志记录,您所需要的是
日志库及其属性文件
要使Log4j与默认的JCL依赖项(通用日志记录)一起工作,只需将Log4j放在类路径上,并为其提供一个配置文件(类路径根目录中的log4j.properties或log4j.xml )。
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
<scope>runtime</scope>
</dependency>log4j.properties
log4j.rootCategory=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n
log4j.category.org.springframework.beans.factory=DEBUG发布于 2019-09-29 08:08:42
使用阻断器,您可以在下面的链接中实现这个one.Check,您将得到一个想法
spring-mvc-4-how-to-intercept-request-with-a-handlerinterceptor
编辑:
使用CommonsRequestLoggingFilter
Spring提供CommonsRequestLoggingFilter,可以记录请求URL、正文等相关信息。
LoggingConfig.java
import 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.properties
logging.client = true
logging.query = true
logging.payload = true
logging.headers = truehttps://stackoverflow.com/questions/58153215
复制相似问题