spring - 如何在 Spring Cloud Sleuth 中为命令行运行程序设置行李字段?
问题描述
我在 Spring Boot 微服务中成功使用了 Spring Cloud Sleuth,并且正在适当地记录字段并通过 http 标头发送。
我现在需要在 Spring Boot 命令行运行程序应用程序中集成相同的日志记录和标头传播过程,但看起来没有自动设置跟踪和跨度,因为它不在 Http 请求的中间(因为它是一个命令线应用程序)。我在日志中看不到这些字段(在日志配置中使用相同的 %X 格式)。
我查看了文档,找不到此特定用例的任何示例。这在命令行运行器应用程序中是否可行?
解决方案
为了添加行李,您需要有一个跨度。当调用控制器时,Spring Cloud Sleuth 和 Spring Boot 会为您创建一个跨度。如果你想使用 CLI 应用程序做同样的事情,你需要自己创建 span。
你有两个选择。
Span span = this.tracer.nextSpan().name("mySpan");
// do some work
span.end(); // best to put it in finally to make sure span is always ended
或者您可以使用注释:
@NewSpan
public void doWork() {
}
如果您使用注解,请记住AOP 代理限制。特别是自我调用(使用 调用this
)将不起作用。
@SpringBootApplication
public class ConsoleApplication
implements CommandLineRunner {
@Override
public void run(String... args) {
doWork(); //this is the same as this.doWork();
}
@NewSpan
public void doWork() {
}
}
这是行不通的,因为doWork
不是通过 AOP 代理调用的。确保注释 Spring 管理的组件,然后使用注入的实例。
@SpringBootApplication
public class ConsoleApplication
implements CommandLineRunner {
@Autowired
private MyService myService;
@Override
public void run(String... args) {
myService.doWork();
}
}
@Component
class MyService {
@NewSpan
public void doWork() {
}
}
在这种情况下myService
,不是 的实例MyService
,而是检测代理。
推荐阅读
- java - 为什么 HttpContext 接受来自所有以指定路径开头的 URI 的请求?
- javascript - 使用 Javascript 或 Jquery 更改画布值
- javascript - 在 Chrome Devtools 协议中,什么是 `injectedScriptId`?
- java - 如何使用 spring 'ResourcePatternResolver' 从指定路径读取所有文件
- django - Nginx 和 uwsgi 使用 Moviepy 花费 n* 加载时间
- javascript - 无法在导入的函数上运行模拟
- java - 如何为“TAB”和“ARROW”键自定义 NatTable 的表格单元格导航功能以获得可接受的可用性
- javascript - 如何使用尽可能少的代码使用引导程序制作多项目轮播?
- python - 无论我做什么都无法将数据附加到文件
- java - Maven 原型`quickstart` 无法扩展其 POM