【发布时间】:2021-07-12 13:36:32
【问题描述】:
我们正在使用 apache beam 并希望设置 logback MDC。 logback MDC 是一个很棒的资源,当你有一个请求进来并且你存储了一个 userId(在我们的例子中,它是 custId、fileId、requestId),然后每当开发人员登录时,它就会神奇地将这些信息标记到开发人员日志上.开发人员不再忘记在他添加的每个日志语句中添加它。
我开始使用嵌入我们微服务中的 Apache Beam Direct Runner 进行端到端集成类型测试(在生产中,微服务调用数据流)。目前,我看到 MDC 在调用 expand() 方法之前一直很好。一旦调用了 processElement 方法,上下文当然就消失了,因为我在另一个线程中。
所以,首先尝试修复这个部分。我应该把这个上下文放在哪里,以便我可以在这个线程的开头恢复它。
例如,如果我有一个 Executor.execute(runnable),那么我只需像这样使用该 runnable 传输上下文
public class MDCContextRunnable implements Runnable {
private final Map<String, String> mdcSnapshot;
private Runnable runnable;
public MDCContextRunnable(Runnable runnable) {
this.runnable = runnable;
mdcSnapshot = MDC.getCopyOfContextMap();
}
@Override
public void run() {
try {
MDC.setContextMap(mdcSnapshot);
runnable.run();
} Catch {
//Must log errors before mdc is cleared
log.error("message", e);. /// Logs error and MDC
} finally {
MDC.clear();
}
}
}
所以我基本上需要对 apache Beam 做同样的事情。我需要
- 有一点要占领 MDC
- 有一点要恢复 MDC
- 有一点要清除 MDC 以防止它泄漏到另一个请求(真的以防我错过了似乎不时发生的事情)
关于如何做到这一点的任何想法?
哦,如果在框架记录任何异常时 MDC 可以在那里,则可以加分!!!! (即,理想情况下,框架应该为您执行此操作,但 apache Beam 似乎没有执行此操作。大多数 Web 框架都内置了此功能)。
谢谢, 院长
【问题讨论】:
标签: google-cloud-dataflow apache-beam logback slf4j