SpringBoot3中LoggingMeterRegistry配置及MetricFilter自定义问题
Spring Boot 3 中 LoggingMeterRegistry 的配置与指标过滤实现
1. 通过 application.yaml 配置 step 等参数
直接new LoggingMeterRegistry()不会自动读取配置文件属性,需要借助Spring Boot提供的LoggingProperties绑定配置,让Bean感知yaml中的参数:
步骤1:修改Bean定义,注入LoggingProperties
import io.micrometer.core.instrument.Clock; import io.micrometer.core.instrument.logging.LoggingMeterRegistry; import io.micrometer.core.instrument.logging.LoggingRegistryConfig; import org.springframework.boot.actuate.autoconfigure.metrics.export.logging.LoggingProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MeterRegistryConfig { @Bean LoggingMeterRegistry loggingMeterRegistry(LoggingProperties loggingProperties) { LoggingRegistryConfig config = loggingProperties.getExport().getLogging(); return new LoggingMeterRegistry(config, Clock.SYSTEM); } }
步骤2:在 application.yaml 中配置参数
使用management.metrics.export.logging前缀配置相关属性:
management: metrics: export: logging: enabled: true step: 30s # 指标输出间隔,默认值为1分钟(1m) log-level: INFO # 日志输出级别,可选TRACE/DEBUG/INFO/WARN/ERROR descriptions: false # 是否输出指标描述,默认false
2. 注册自定义 MetricFilter 过滤输出
你提到的com.codahale.metrics.MetricFilter是Dropwizard Metrics的API,而Micrometer自身使用io.micrometer.core.instrument.MeterFilter接口,需要先将Dropwizard的Filter适配为Micrometer的Filter,再添加到LoggingMeterRegistry中:
示例代码:适配Dropwizard MetricFilter并注册
import com.codahale.metrics.MetricFilter; import io.micrometer.core.instrument.Clock; import io.micrometer.core.instrument.MeterFilter; import io.micrometer.core.instrument.logging.LoggingMeterRegistry; import io.micrometer.core.instrument.logging.LoggingRegistryConfig; import org.springframework.boot.actuate.autoconfigure.metrics.export.logging.LoggingProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Collections; @Configuration public class MeterRegistryConfig { @Bean LoggingMeterRegistry loggingMeterRegistry(LoggingProperties loggingProperties) { // 自定义Dropwizard MetricFilter:仅保留名称包含"http"的指标 MetricFilter dropwizardFilter = (metricName, metric) -> metricName.contains("http"); // 将Dropwizard Filter适配为Micrometer MeterFilter MeterFilter micrometerFilter = MeterFilter.dropFiltered( meterId -> !dropwizardFilter.matches(meterId.getName(), null) ); LoggingRegistryConfig config = loggingProperties.getExport().getLogging(); // 将自定义Filter传入LoggingMeterRegistry构造方法 return new LoggingMeterRegistry(config, Clock.SYSTEM, Collections.singletonList(micrometerFilter)); } }
更简便的方式:直接使用Micrometer原生MeterFilter
如果不需要依赖Dropwizard的Filter,直接用Micrometer的API更简洁:
@Bean LoggingMeterRegistry loggingMeterRegistry(LoggingProperties loggingProperties) { // 自定义Filter:拒绝所有以"jvm."开头的指标 MeterFilter customFilter = MeterFilter.denyNameStartsWith("jvm."); LoggingRegistryConfig config = loggingProperties.getExport().getLogging(); return new LoggingMeterRegistry(config, Clock.SYSTEM, Collections.singletonList(customFilter)); }
内容的提问来源于stack exchange,提问作者Antonio Petricca
相关产品推荐
相关产品推荐

