Project Reactor文档建议使用以下模式记录MDC日志:
.doOnEach(logOnNext(r -> LOG.debug("found restaurant {} for ${}", r.getName(), r.getPricePerPerson())))
为避免每次都要包装每个日志调用,是否可以使用自定义的订阅者,在每个信号之前从当前上下文填充MDC,并使用
Hooks.onEachOperator(Operators.lift(...)
)添加?我的主要关注点是:1.) 即使没有任何日志记录,每个信号之前填充MDC的成本如何。
2.) 运算符融合:每个运算符上的
Operators.lift(...)
是否有效地禁用了运算符融合?尝试使用StepVerifier#expectFusion
进行快速测试似乎表明是这样的。如果这是真的,那么实际上会受到多大性能影响?感谢您的任何建议!
Flux
),因此在每个onNext
信号周围设置和清除任何ThreadLocal
(基于MDC)非常重要。您可以编写一个帮助方法,在doOnEach
操作符中填充MDC、执行日志记录并清除MDC。 - Simon BaslétransformDeferredContextual
来创建自定义的flatMap
实现并使用可用的上下文设置MDC的原因?这似乎类似于在此处讨论的方法,而不会影响每个管道。 - mowwwalkerHooks.onEachOperator
也不会成为问题,因为我们的反应链受网络操作的性能限制。但是,如果使用该钩子影响其他库和框架,那么很难确信它不会对它们的内部操作产生重大影响。 - mowwwalker