如何禁用Spring Boot Actuator端点200 OK请求的日志?
解决Spring Boot Actuator Prometheus端点日志刷屏问题
你的刷屏日志都是Spring MVC输出的DEBUG级日志,来自FrameworkServlet、LogFormatUtils等类。以下是几个无需硬编码URL、能精准屏蔽Prometheus端点成功请求日志的方案:
方案1:Logback自定义过滤器(仅需配置文件,推荐)
如果使用Spring Boot默认的Logback日志框架,直接修改/创建src/main/resources/logback-spring.xml,添加针对Prometheus日志的过滤规则:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 继承Spring Boot默认日志配置 --> <include resource="org/springframework/boot/logging/logback/defaults.xml"/> <include resource="org/springframework/boot/logging/logback/console-appender.xml"/> <!-- 过滤FrameworkServlet中Prometheus的200响应日志 --> <logger name="org.springframework.web.servlet.FrameworkServlet" level="DEBUG"> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator> <expression>(message.contains("Completed 200 OK") && message.contains("prometheus")) || message.contains("/actuator/prometheus")</expression> </evaluator> <OnMatch>DENY</OnMatch> </filter> </logger> <!-- 过滤LogFormatUtils中Prometheus的请求/响应内容日志 --> <logger name="org.springframework.core.log.LogFormatUtils" level="DEBUG"> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator> <expression>message.contains("/actuator/prometheus") || message.contains("system_cpu_usage")</expression> </evaluator> <OnMatch>DENY</OnMatch> </filter> </logger> <!-- 过滤消息转换器处理Prometheus响应的日志 --> <logger name="org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor" level="DEBUG"> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator> <expression>message.contains("text/plain;version=0.0.4")</expression> </evaluator> <OnMatch>DENY</OnMatch> </filter> </logger> <root level="INFO"> <appender-ref ref="CONSOLE"/> </root> </configuration>
这个配置会精准拦截Prometheus端点的请求日志、200响应日志,以及响应内容的DEBUG输出,完全不影响其他端点的日志。
方案2:极简配置(牺牲部分精准度)
如果不想写XML配置,可直接在application.properties中调整特定类的日志级别,关闭那些输出Prometheus刷屏日志的类的DEBUG日志:
# 关闭LogFormatUtils的DEBUG日志(该类主要输出请求/响应内容) logging.level.org.springframework.core.log.LogFormatUtils=INFO # 关闭FrameworkServlet的DEBUG日志(会过滤所有端点的200响应DEBUG日志) logging.level.org.springframework.web.servlet.FrameworkServlet=INFO
注意:这个方法会关闭上述类的所有DEBUG日志,如果你需要其他端点的这些日志,方案1更合适。
方案3:基于端点类的MDC过滤(无URL硬编码)
如果需要完全不依赖URL,可通过识别Prometheus端点的类来标记请求,再过滤日志:
- 写一个拦截器,标记Prometheus端点的请求:
@Component public class PrometheusMarkerInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (handler instanceof HandlerMethod handlerMethod) { if (handlerMethod.getBean() instanceof PrometheusScrapeEndpoint) { MDC.put("isPrometheus", "true"); } } return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { MDC.remove("isPrometheus"); } }
- 注册拦截器:
@Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private PrometheusMarkerInterceptor interceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(interceptor); } }
- 在
logback-spring.xml中添加MDC过滤器:
<turboFilter class="ch.qos.logback.classic.turbo.MDCFilter"> <MDCKey>isPrometheus</MDCKey> <Value>true</Value> <OnMatch>DENY</OnMatch> </turboFilter>
这个方法通过识别PrometheusScrapeEndpoint类标记请求,即使未来端点URL变更,也无需修改代码。
内容的提问来源于stack exchange,提问作者und3rh00ds
相关产品推荐
相关产品推荐

