首页 > 解决方案 > Operators#lift:MDC 日志记录的好主意?

问题描述

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似乎表明了这一点。如果这是真的,在实践中这对性能有多大影响?

任何输入表示赞赏!

标签: javareactive-programmingproject-reactormdc

解决方案


这是 Sleuth 最初采用的方法,通过Hooks.onEachOperator. 但是,如果您只需要对反应式管道中的一部分操作进行日志记录/MDC ,这将非常昂贵并且可能不值得。更不用说这种方法不仅会影响您定义的反应步骤,还会影响任何其他库/框架。

该建议的存在是有原因的:更好的控制、更少的影响和更明确的方法。


推荐阅读