如何配置Spring Boot Actuator忽略Logback过滤器拒绝的日志指标?
解决Logback自定义过滤器过滤后logback.events指标仍统计被拒绝事件的问题
嘿,我碰到过类似的问题,这就帮你捋清楚怎么解决!
问题原因
你在Appender层面添加的过滤器,只会阻止日志输出到指定的Appender(比如你的Console输出),但Logback的事件在到达Appender之前,已经被LoggerContext收集并上报给Micrometer的logback.events指标了。所以即使Appender过滤掉了事件,指标还是会统计到这些被拒绝的日志。
解决方案
有两种常用的方法可以解决这个问题,推荐优先用第一种,更简单直观:
方法1:把过滤器移到Logger层面
将自定义过滤器配置在<logger>标签下,而不是Appender中。这样日志事件在进入任何Appender之前就会被过滤掉,自然也不会被logback.events指标统计到。
修改你的logback配置如下:
<springProfile name="prod"> <!-- 把过滤器加到Logger层面,针对你需要过滤的包/类 --> <logger name="com.example" level="INFO"> <filter class="com.example.config.CustomEventFilter"/> </logger> <appender name="Console" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="net.logstash.logback.encoder.LogstashEncoder"/> <!-- 这里不再需要过滤器了 --> </appender> </springProfile>
注意:name="com.example"要替换成你实际需要过滤的日志包名或者类名,如果要全局过滤,可以配置根Logger(<root>标签)。
方法2:自定义Logback Metrics绑定逻辑
如果必须在Appender层面保留过滤器,那可以通过自定义Micrometer的LogbackMetrics绑定,手动排除被拒绝的事件。
创建一个配置类,替换默认的LogbackMetrics绑定:
import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.logback.LogbackMetrics; import org.slf4j.LoggerFactory; import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.spi.FilterReply; @Configuration public class CustomLogMetricsConfig { @Bean public MeterRegistryCustomizer<MeterRegistry> logbackMetricsCustomizer() { return registry -> { LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); // 移除默认的LogbackMetrics TurboFilter loggerContext.getTurboFilterList().removeIf( filter -> filter instanceof LogbackMetrics.LogbackMetricsTurboFilter ); // 创建自定义的LogbackMetrics,只统计被ACCEPT的事件 LogbackMetrics customLogMetrics = new LogbackMetrics(registry) { @Override protected void handleLoggingEvent(ILoggingEvent event) { // 用你的自定义过滤器判断事件是否应该被统计 com.example.config.CustomEventFilter customFilter = new com.example.config.CustomEventFilter(); FilterReply filterReply = customFilter.decide(event); if (FilterReply.ACCEPT.equals(filterReply)) { super.handleLoggingEvent(event); } } }; // 可以添加自定义标签(可选) customLogMetrics.setTags(io.micrometer.core.instrument.Tag.of("app", "your-application-name")); customLogMetrics.bindTo(loggerContext); }; } }
这个方法通过拦截LogbackMetrics的事件处理逻辑,只让通过自定义过滤器的事件被统计到指标中。
总结
优先选择方法1,配置更简洁,不需要额外编写Java代码,就能从根源上阻止被过滤的事件进入指标统计流程。如果因为业务限制必须在Appender层面过滤,再考虑方法2。
内容的提问来源于stack exchange,提问作者Dinosaur-Guy
相关产品推荐
相关产品推荐

