在Java中使用reactor模式透明记录相关/请求id
问题由两部分组成在Java中使用reactor模式透明记录相关/请求id,java,logging,log4j,slf4j,reactor,Java,Logging,Log4j,Slf4j,Reactor,问题由两部分组成 此id的正确名称是什么。我在internet上看到不同的名称:关联id、请求id、事务id。 我将举一个例子来更好地描述我所说的,而我希望这是非常常见和明显的情况 我希望操作的每个日志都带有唯一的id,以便能够使用此id对日志进行grep,并查看与操作相关的每个语句 class Controller { void process(Request request) { log.debug("{} Request accepted {}", id, request)
class Controller {
void process(Request request) {
log.debug("{} Request accepted {}", id, request)
Result result = service.process(request.data())
log.debug("{} Request ended with {}", id, result)
}
}
class Service {
void process(Data data) {
log.debug("{} Service started processing data {}", id, data);
Result resultOne = repoOne.modify(data);
log.debug("{} Repo one returned {}", id, resultOne);
Result resultTwo = repoTwo.modify(data);
log.debug("{} Repo two returned {}", id, resultTwo);
return combinedResult(resultOne, resultTwo);
}
}
并且日志在整个过程中应具有相同的唯一id
ABCDE-ID Request accepted WITH DATA
ABCDE-ID Service started processing DATA
ABCDE-ID Repo one returned SUCCESS
ABCDE-ID Repo two returned FAILURE
ABCDE-ID Request ended with FAILURE
简单的解决方案是将id作为参数添加到每个方法中,但这在我看来很难看。我正在寻找另一种解决方案。如果您可以确保调用链将在同一
线程中执行,则可以使用ThreadLocal
存储您的关联id
事实上,Log4J MDC(映射诊断上下文)功能允许您开箱即用。当使用反应式编程时,您不能确保事务的所有部分都在同一线程中执行,因此在这种情况下,基于ThreadLocal的方法无法工作。