Spring Boot:如何通过所有程序从控制器传递参数(请求ID)?

SpringBoot: how to pass argument (request id) from controller through all program?

我使用 Spring Boot 应用程序。每个请求都有 ID。在某些服务和程序的低级别位置记录错误时,我必须使用此 ID。我该如何实施?谢谢!

要将上下文 ID 添加到您的日志中,您可以使用 MDC:

在您的代码中:

 MDC.put("first", "Dorothy");

在你的 logback.xml

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> 
  <layout>
    <Pattern>%X{first} %X{last} - %m%n</Pattern>
  </layout> 
</appender>

https://logback.qos.ch/manual/mdc.html

您可以使用 ThreadLocal 来存储特定线程的 ID。

然后,在您的服务中,您可以通过 ThreadLocal#get 方法获取该 ID。

例如(这只是一种做法):

class AppProvider {
    public static final ThreadLocal<String> APP_CONTEXT = new ThreadLocal<String>();
}

class Controller {
    public void users(@RequestParam String id) {
        AppProvider.APP_CONTEXT.set(id);
        .......
    }
}

class Service {
    try {
    } catch (Exception e) {
        log.error(String.format("Id: %s", AppProvider.APP_CONTEXT.get()));
    }
}

这只是一种使用 ThreadLocal 的方法。

查看内存泄漏处理: