gpt4 book ai didi

java - 在运行时,有没有办法检查哪个 API/ Controller 方法导致 Spring Boot 应用程序中的当前执行点?

转载 作者:行者123 更新时间:2023-12-02 09:44:36 25 4
gpt4 key购买 nike

本质上,我在 Spring Boot 应用程序中实现了一些动态日志记录,并且需要根据哪个 API 调用导致在服务层中某处的方法执行期间引发异常来记录服务层中放置的异常。我想知道我是否可以在这个方法中检查哪个 API 引导我们到达当前的执行点?

我知道我可以使用堆栈跟踪来基本上追溯到导致当前执行点的特定 Controller 方法,但是这涉及到一些糟糕的代码,我正在积极检查 StackTraceElement 是否包含“.controller”作为子字符串。此外,如果涉及递归,堆栈跟踪可能会非常长......导致效率低下。还有其他选择吗?或者这种方法可以变得更高效/更清洁吗?

Controller :

@PostMapping(value = "/apiOne")
public Response exchangeApi1(){
....
someService.doMethod(params);
....
}

@PostMapping(value = "/apiTwo")
public Response exchangeApiTwo(){
....
someService.doMethod(params);
....
}

服务层:

@Service
public class SomeService {
....
public void doMethod(params){
....
String api = getCallingAPI()//I need this method. Does such a thing exist in native Spring libraries?

switch (api) {
case "apiOne":
LOG.error(Alert Level 1);
break;
case "apiTwo":
LOG.error(Alert Level 3);
break;
throw BusinessException();
.....
}
......
}

我需要一些本质上可以用作上面代码片段中的 getCallingAPI() 方法的东西。

编辑:我意识到我显然可以将 API 名称作为参数传递,但我忘记提及的是 doMethod()/抛出的异常可能是几个服务层,并且 API 名称本质上对很多人来说都是无用的最终导致 doMethod 执行的方法/无论抛出异常的地方。我需要一些更干净的东西。

最佳答案

一种可能性是使用 MDC您的日志框架(例如 slf4j/logback)的(映射诊断上下文)。 MDC 在每个线程的基础上存储数据,因此对于每个用户请求,这是存储上下文信息的简单方法。

在调用 API 时,您可以在上下文中设置所需的信息,并在离开该方法之前从 MDC 中清除它。

import org.slf4j.MDC;

...

@PostMapping(value = "/apiOne")
public Response exchangeApi1() {
MDC.put("api", "exchangeApi1");
....
someService.doMethod(params);
....
MDC.remove("api");
}

更好、更干净的方法可能是将这种行为提取到 aspect 中或servlet filter减少样板代码。

在 doMethod() 中,您可以通过简单的方式访问 api 信息:

MDC.get("api");

要在日志输出中包含 MDC 信息,您可以相应地配置附加程序。 logback 的示例可以在 documentation 中找到。 。

关于java - 在运行时,有没有办法检查哪个 API/ Controller 方法导致 Spring Boot 应用程序中的当前执行点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56762594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com