仅在 Spring Boot 中的请求日志 CommonsRequestLoggingFilter 之前设置

lev*_*ver 12 java logging spring spring-boot

CommonsRequestLoggingFilter在记录请求方面非常好,但就我而言,它在处理请求之前和之后记录相同的内容,这是重复且冗余的。我想摆脱请求后处理日志,但我找不到如何做到这一点。有任何想法吗?

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CommonsRequestLoggingFilter;

@Configuration
public class RequestLoggingFilterConfig {

    @Bean
    public CommonsRequestLoggingFilter logFilter() {
        CommonsRequestLoggingFilter filter = new CommonsRequestLoggingFilter();
        filter.setIncludeClientInfo(true);
        filter.setIncludeHeaders(true);
        filter.setIncludePayload(false);
        filter.setIncludeQueryString(true);
        return filter;
    }
}

Run Code Online (Sandbox Code Playgroud)

我从这里开始

kla*_*sch 9

org.springframework.web.filter.CommonsRequestLoggingFilter类只是org.springframework.web.filter.AbstractRequestLoggingFilter的子类。因此,跳过 CommonsRequestLoggingFilter 并编写您自己的子类,并将覆盖的方法保留afterRequest()为空。

public class CustomizedRequestLoggingFilter extends AbstractRequestLoggingFilter {

    @Override
    protected void beforeRequest(HttpServletRequest httpServletRequest, String message) {
        this.logger.debug(message);
    }

    @Override
    protected void afterRequest(HttpServletRequest httpServletRequest, String message) {

    }
}
Run Code Online (Sandbox Code Playgroud)

使用此类代替org.springframework.web.filter.CommonsRequestLoggingFilter


voc*_*uoi 5

为了避免重复记录,在实例化时,CommonsRequestLoggingFilter您必须覆盖两者之一:

  • beforeRequest()
  • 请求后()

要禁用 afterRequest() 中的日志记录,可以更改 OP 的代码,如下所示:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CommonsRequestLoggingFilter;

@Configuration
public class RequestLoggingFilterConfig {

    @Bean
    public CommonsRequestLoggingFilter logFilter() {
        CommonsRequestLoggingFilter filter = new CommonsRequestLoggingFilter() {
            @Override
            public void afterRequest(HttpServletRequest request, String message) {
                // No body, we are just overriding the default behavior
            }
        };

        filter.setIncludeClientInfo(true);
        filter.setIncludeHeaders(true);
        filter.setIncludePayload(false);
        filter.setIncludeQueryString(true);
        return filter;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在这种情况下(使用匿名类扩展),需要在配置类本身上设置日志级别,例如 `logging.level.com.mypackage.myproject.RequestLoggingFilterConfig=DEBUG` (4认同)