问题描述
Project Reactor 文档建议采用以下 MDC 日志模式:
.doOnEach(logonNext(r -> LOG.debug("found restaurant {} for ${}",r.getName(),r.getPricePerPerson())))
为了避免必须包装每个日志记录调用,自定义订阅者,在每个信号之前从 currentContext 填充 MDC,使用 Hooks.onEachOperator(Operators.lift(...)
) 添加是一个好主意吗?
我的主要关注点是:
1.) 在每个信号之前填充 MDC 的成本,即使没有发生日志记录。
2.) 算子融合:每个算子上的 Operators.lift(...)
是否有效地禁用了算子融合?尝试使用 StepVerifier#expectFusion
进行快速测试似乎表明了这一点。如果这是真的,在实践中这对性能有多大影响?
感谢任何输入!
解决方法
这是 Sleuth 最初采用的方法,通过 Hooks.onEachOperator
。但是,如果您只需要在反应式管道中的操作子集上进行日志记录/MDC,那么这非常成本很高,并且可能不值得。更不用说这种方法不仅会影响您定义的响应式步骤,还会影响任何其他库/框架。
提出建议是有原因的:更好的控制、更少的影响和更明确的方法。