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

感谢任何输入!

解决方法

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...