当前位置: 首页 > 知识库问答 >
问题:

允许在Spring WebFlux中填充ServerWebExchange.logPrefix以进行UniqueRequestId日志记录

周意智
2023-03-14

Springwebflux提供处理程序,它接受ServerRequest并且是我们实现代码的地方。根据下面的文章,Spring有一个logid概念,它似乎是我所说的uniqueRequestId。当抛出异常时,框架将通过AbstracTerrorWebExceptionHandler/ServerWebExchangeLogID放入日志条目。我的情况涉及到有许多服务相互调用并共享一个uniqueRequestId。因此,我们不希望Spring生成这个ID,而是希望通过HTTP请求头(例如x-request-id)来设置logid。我的理由是,一个服务的日志可以与另一个服务的日志相关。我找不到关于如何实现这一点的文章。

一些相关的背景:我管理了一个90%的替代解决方案,通过将UniqueRequestId设置到MDC(ThreadLocal)中,然后基于此特性通过反应链传递UniqueRequestId到日志中(https://projectreactor.io/docs/core/release/reference/#context->请参见“Adding a Context to a reactive sequence”)。这适用于在我的反应序列+处理程序中处理的代码,但如果我的代码抛出exceptionmono.error(...),那么似乎Spring WebFlux框架将日志分派到异步线程,因此MDC和上下文都丢失了。因此,我希望通过将我的UniqueRequestId插入LogID来解决最后的问题。

https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html#webflux-logging-id

Spring:Boot:2.4.1,Web+WebFlux:5.3.2

共有1个答案

井洲
2023-03-14

您是否希望使用uniqueRequestId为自己实现相关部分?

如果您只希望能够跟踪服务上或跨服务的处理,那么您应该查看跟踪解决方案,这些解决方案通常可以在应用程序性能监视库中找到。

我认为您可以使用spring-cloud-sleuth,只使用日志相关性(https://cloud.spring.io/spring-cloud-sleuth/reference/html/#only-sleuth-log-correlation)

Sleuth支持reactor(spring webflux),它会自动添加一些数据到日志中

  1. trace.id跟踪表示可能发生在多个服务上的操作或数据流。对我来说,这是您正在寻找的,该跟踪被发送到其他服务,以便它们在日志中重用它。允许您通过多个服务跟踪特定呼叫。
  2. transaction.id事务表示同一服务内的操作或数据流。

例如(下面的代码不起作用,它只是给你一个想法):

    null
public class serviceA() {

  private final ServiceBClient serviceBClient;

  @Get
  public Flux<Cat> getSomething() {
    log.info('Calling serviceB');
    return serviceBClient
      .listAllCats()
      .then(() -> {    log.info('Called serviceB') });
  }

}
public class serviceB() {

  private final CatRepository catRepository;

  @Get
  public Flux<Cat> listCats() {
    log.info('Asking for cats');
    return catRepository.listAll()
     .doOnSuccess(() -> { log.info('Request success!') })
  }

}
[INFO] .... Calling serviceB, trace.id=1321313543121, transaction.id=123546   
[INFO] .... Called serviceB, trace.id=1321313543121, transaction.id=123546
[INFO] .... Asking for cats, trace.id=1321313543121, transaction.id=224465   
[INFO] .... Called serviceB, trace.id=1321313543121, transaction.id=224465

Sleuth还应该将trace.id添加到错误日志中

 类似资料:
  • 问题内容: 我需要与执行日志记录使用。 我在没有基本示例的情况下实现了日志记录? 也有小的样本在不使用日志的情况下使用(只是制作了)? 我不知道如何整合它? 问题答案: Spring使我们使用AOP变得非常容易。这是一个简单的日志记录示例: 然后只需配置你的applicationContext.xml(或等效文件): 你会在MyLogger类中注意到我@After在方法上方指定的内容。这被称为建议

  • 从docker容器中将结构化日志写入journald的最佳方式是什么? 例如,我有一个使用sd_journal_send而不是更改应用程序的应用程序,我尝试通过 -v/var/log/systemd/journal:/var/log/systemd/journal docker journald输出日志记录选项有哪些限制?它似乎不支持应用程序编写不仅仅是消息字段。 -- 所以我发现我需要 C程序可

  • 问题内容: 我想将“跟踪”消息添加到我的所有公共方法中,如下所示: 现在,我想使用AOP(和字节码检测)将所有这些自动添加到我的方法中。我在想。是否有意义?您知道任何开放源代码吗? 问题答案: 我创建了一个简单的方面来捕获公共方法的执行。该AspectJ代码的核心是切入点定义: 在这里,我们将捕获任何包,任何类,具有任意数量的参数,具有任何返回类型的所有公共方法。 建议执行可以在下面的代码段中可视

  • 我正在尝试使用PostSharp和multicastAttribute实现日志记录。使用PostSharp诊断库中的日志功能。 我有一个GlboalAspects。启动项目目录中的cs。内容如下。 右键单击我的项目并选择属性,默认命名空间是“alp_generator” 我不知道“PostSharp.Patterns.Diagnostics.LogAttribute”是否正确。 我根本没有日志记录

  • 问题内容: 我有一个要登录的Maven&Spring应用程序。我热衷于使用SLF4J。 我想将所有配置文件放入包含log4j.xml的目录{classpath} / config中,然后使用spring bean进行初始化。 例如 但是,我得到此警告,没有日志记录。 log4j:WARN找不到记录器的附加程序(org.springframework.context.support.ClassPat