You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让CorrelationIdFilter在Logbook日志记录前执行?

让CorrelationIdFilter在Logbook日志记录前执行的解决方案

要解决Logbook先记录日志、CorrelationIdFilter后执行的问题,核心是调整过滤器的执行优先级,让你的CorrelationIdFilter比Logbook的过滤器更早触发。以下是两种可行方案:

方案一:给CorrelationIdFilter添加@Order注解

直接在过滤器类上添加@Order注解,设置比Logbook过滤器更高的优先级(数值越小优先级越高)。Logbook默认过滤器优先级为Ordered.HIGHEST_PRECEDENCE + 10,将自己的过滤器设为Ordered.HIGHEST_PRECEDENCE即可确保先执行:

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
class CorrelationIdFilter : GenericFilterBean() {
    private val log = MyLogger.getLogger(this::class.java)

    override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) {
        if (request is HttpServletRequest) {
            val correlationId = getCorrelationId(request)
            MDC.put("correlationId", correlationId)
            // 可选:将correlationId写入响应头,方便下游服务追踪
            (response as HttpServletResponse).setHeader("x-correlation-id", correlationId)
        }

        try {
            chain.doFilter(request, response)
        } finally {
            // 必须清除MDC,避免线程池复用导致的上下文污染
            MDC.remove("correlationId")
        }
    }

    private fun getCorrelationId(request: HttpServletRequest): String {
        val correlationId = request.getHeader("x-correlation-id")
        return correlationId ?: "cid-${UUID.randomUUID()}"
    }
}

方案二:通过FilterRegistrationBean手动注册过滤器

如果不想依赖@Component自动扫描,可通过配置类手动注册过滤器并指定优先级,这种方式更灵活:

@Configuration
class FilterConfiguration {
    @Bean
    fun correlationIdFilterRegistration(): FilterRegistrationBean<CorrelationIdFilter> {
        val registrationBean = FilterRegistrationBean<CorrelationIdFilter>()
        registrationBean.filter = CorrelationIdFilter()
        registrationBean.order = Ordered.HIGHEST_PRECEDENCE
        // 指定需要过滤的URL路径,默认是/*
        registrationBean.urlPatterns = listOf("/*")
        return registrationBean
    }
}

关键注意事项

  1. 清除MDC上下文:一定要在finally块中移除MDC的correlationId,否则线程池中的线程复用会导致后续请求继承错误的上下文数据。
  2. 日志配置验证:确保你的日志框架(Logback/Log4j2)配置中已添加%X{correlationId}来打印这个字段,比如:
    <!-- Logback示例 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg %X{correlationId}%n</pattern>
        </encoder>
    </appender>
    

内容的提问来源于stack exchange,提问作者bpereira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 16:04:50