【问题标题】:How to exclude certain HTTP requests from being logged in Java Spring (e.g. /health Endpoint)如何在 Java Spring 中排除某些 HTTP 请求(例如 /health Endpoint)
【发布时间】:2021-09-17 21:30:00
【问题描述】:

在我的 Spring Boot 应用程序中进行以下设置:

logging.org.springframework.web: DEBUG

记录所有 HTTP 请求,这很酷!

但是,由于 /health 端点不断被轮询,这会向日志文件发送垃圾邮件。 如何仅为此端点禁用请求日志记录?

【问题讨论】:

  • 我不知道答案,但 DEBUG 的日志级别总是垃圾邮件。

标签: java spring logging filter actuator


【解决方案1】:

我推荐使用 Spring 内置的请求日志过滤器CommonsRequestLoggingFilter

要启用日志过滤器,您需要设置属性:

logging.level.org.springframework.web.filter.CommonsRequestLoggingFilter=DEBUG

但是当您需要指定自定义规则以启用日志记录时,您可以通过以下方式创建自定义实现:

@Component
public class RequestLoggingFilter extends AbstractRequestLoggingFilter {

    private Set<String> excludedUrls = Set.of("/health");

    @Override
    protected boolean shouldLog(HttpServletRequest request) {
        if(excludedUrls.contains(request.getRequestURI())) {
            return false;
        }
        return logger.isDebugEnabled();
    }

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

    @Override
    protected void afterRequest(HttpServletRequest request, String message) {
        logger.debug(message);
    }
}

要启用过滤器,请将以下配置属性添加到application.properties

logging.level.<package_name>.RequestLoggingFilter=DEBUG

【讨论】:

  • 非常感谢您的广泛回答,包括示例代码!!!这似乎删除了“请求前”和“请求后”的日志行。但是,当 AbstractRequestLoggingFilter.doFilterInternal 调用 filterChain.doFilter 时会记录很多内容。这部分仍在记录中。
  • (跟踪模式下 6 行,调试模式下 4 行)。
  • 我的回答就像示例一样,您可以定义自己的过滤器,该过滤器不会从 AbstractRequestLoggingFilter 扩展,或者您可以覆盖正确记录的方法,但记录请求的主要思想应该基于过滤器。
猜你喜欢
  • 1970-01-01
  • 2018-03-29
  • 2021-12-30
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-13
  • 1970-01-01
相关资源
最近更新 更多