如何让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 } }
关键注意事项
- 清除MDC上下文:一定要在
finally块中移除MDC的correlationId,否则线程池中的线程复用会导致后续请求继承错误的上下文数据。 - 日志配置验证:确保你的日志框架(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
相关产品推荐
相关产品推荐

