使用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())) 
                );
    }

我的尝试:

  1. 返回字符串通量

.then(Mono.just(String.format(“找到%s个学生”,counter.get())) .doOnEach(logonNext(LOGGER :: info)))

  1. 没有日志
.doOnComplete(() -> Mono.just(String.format("%s students found",counter.get()))
.doOnEach(logonNext(LOGGER::info))
.then() // no log
.subscribe() // log without MDC
)
  1. 每个计数都记录下来,我想要最终计数
.doOnEach(logonNext( x -> LOGGER.info("{} students found",counter.get()))

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

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