生产环境下的反应堆项目日志记录

3

我有一个与生产环境中使用Spring WebFlux和Project Reactor进行日志记录相关的问题。 我在暂存环境中有以下代码,它记录了与信号相关的大量信息,这对于调试非常有用。

Mono.zip(localChargeIdMono, userIdMono, merchantMono, totalAmountMono, requestIdMono)
                .map(this::toNewTransaction)
                        .log("TransactionRepository.save")
                        .then(chargeMono)
                        .map(chargeResult -> Tuples.of(transaction, chargeResult))
                        .map(this::toNewTransactionUpdatedWithChargeResult))
                .flatMap(tuple -> Mono.zip(
                        transactionRepository.save(tuple.getT1()),
                        paymentUpdateRepository.save(tuple.getT2())))
                .log("t.p.save")
                .map(Tuple2::getT1)
                .map(this::toChargeTransactionDto);

但是我想知道这是否是在生产环境中记录日志的正确方式,或者我应该使用doOn*方法仅记录相关数据,例如副作用函数的输入/输出参数。

Mono.zip(localChargeIdMono, userIdMono, merchantMono, totalAmountMono, requestIdMono)
                    .map(this::toNewTransaction)
                            .donOnNext(e -> log.info(e))
                            .then(chargeMono)
                            .map(chargeResult -> Tuples.of(transaction, chargeResult))
                            .map(this::toNewTransactionUpdatedWithChargeResult))
                    .flatMap(tuple -> Mono.zip(
                            transactionRepository.save(tuple.getT1()),
                            paymentUpdateRepository.save(tuple.getT2())))
                     .donOnNext(e -> log.info(e))
                    .map(Tuple2::getT1)
                    .map(this::toChargeTransactionDto);

我希望你能提供一些与在生产环境中使用项目反应器相关的经验,因为这是我第一次使用。

谢谢

1个回答

5
我在想这是否是在生产环境中记录日志的正确方法,或者我应该使用doOn*方法仅记录相关数据,例如副作用函数的输入/输出参数。
你两种方法都可以使用 - 这没有任何问题。它们显然会做不同的事情(log()将为您提供其他订阅器级别的信息,如所请求的需求、取消等,而您将无法从doOnXXX中获得这些信息),但这两种方法在生产中使用都可以。据我所知,它们都不会执行特别昂贵的操作,例如生成堆栈跟踪。
就我所知,在生产中记录日志只有两件真正需要注意的事情:
避免使用Hooks.onOperatorDebug()。当然在调试时非常有用,但会生成大量成本高昂的堆栈跟踪。
必须使用异步appender,而不是同步/阻塞日志记录appender。这个容易被忽略,因为它通常埋在日志配置文件中而不是在代码中,但这是至关重要的 - 否则,您每次日志调用都是一个阻塞操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接