如何解决使用logOnNext的Reactor的MDC日志
我需要在整个应用程序的日志中显示上下文值。 我尝试通过以下方法进行操作:“ searchStudents”,但未成功。似乎当执行“ .doOnComplete()”步骤时,subscriberContext丢失了,我需要替代方法。 有有人建议我吗?
控制器
@GetMapping(value = "{userId}/searchStudents")
public Flux<Student> searchStudents(
@ModelAttribute(USER_CONTEXT_REQUEST_ATTRIBUTE) Context userContext,@PathVariable String userId,@RequestParam String lang,@RequestParam String studentName) {
return coursesProvider.searchStudents(userId,lang,studentName).subscriberContext(userContext);
logUtils
public class LogUtils {
public static <T> Consumer<Signal<T>> logOnNext(Consumer<T> logStatement) {
return signal -> {
if (!signal.isOnNext())
return;
Optional<String> teacherIdMaybe = signal.getContext().getOrEmpty("TEACHER_ID");
if (teacherIdMaybe.isPresent()) {
try (MDC.MDCCloseable teacherIdMdcCloseable = MDC.putCloseable("TEACHER_ID",teacherIdMaybe.get())) {
logStatement.accept(signal.get());
}
} else {
logStatement.accept(signal.get());
};
};
}
}
服务
@Override
public Flux<Student> searchStudents(String userId,String lang,String studentName) {
AtomicInteger counter = new AtomicInteger();
return Mono.just(String.format(">>> Searching student named: %s. <<<",studentName))
.doOnEach(logOnNext(LOGGER::info)) // well logged
.thenMany(webClient.get()
.uri(uriBuilder -> uriBuilder
.path("/v1/users/{userId}/courses/searchStudents/{lang}/{studentName}")
.build(userId,studentName))
.accept(APPLICATION_JSON)
.retrieve()
.bodyToFlux(Student.class)
.filter(Student::isEligible)
.doOnNext(p -> counter.incrementAndGet())
// this is the ligne that I need to change
.doOnComplete(() -> LOGGER.info("{} students found",counter.get()))
);
}
我的尝试:
- 返回字符串通量
.then(Mono.just(String.format(“找到%s个学生”,counter.get())) .doOnEach(logOnNext(LOGGER :: info)))
- 没有日志
.doOnComplete(() -> Mono.just(String.format("%s students found",counter.get())) .doOnEach(logOnNext(LOGGER::info)) .then() // no log .subscribe() // log without MDC )
- 每个计数都记录下来,我想要最终计数
.doOnEach(logOnNext( x -> LOGGER.info("{} students found",counter.get()))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。