用于日志记录和分布式跟踪的Spring Boot自定义启动程序

时间:2017-05-04 06:55:51

标签: java spring spring-boot slf4j spring-cloud-sleuth

我正在开发自定义弹簧启动启动器,目的是为我们在分布式系统中的所有弹簧启动应用程序提供自动配置,这样,每次需要更改配置时,它可以在一个地方完成,而不是遍历应用更改的所有不同应用程序,而只是依赖的版本更新就足够了。

由于我想要讨论的主题是日志记录和分布式跟踪,现在仍然坚持使用logback,但考虑到将来还提供log4j2支持,启动器包含以下依赖项:

  • spring-boot-starter-web
  • spring-cloud-starter-sleuth

我首先要考虑的是在启动器的autoconfigure模块的logback.xml文件夹中包含一个src/main/resources文件,并且使用该启动器的应用程序将获得配置。

我遇到的问题是,当Sleuth在类路径中时,当EnvironmentPostProcessor使用[app name, traceId, spanId, exported]元组更新关卡模式时,显示的应用名称为bootstrap而不是使用启动器在应用程序的application.yml文件中使用spring.application.name定义的名称,不确定原因,无法找到原因的线索:(

所以,为了解决这个问题,我做了以下几点:

  • 在模式${LOG_LEVEL_PATTERN:-%5p}中替换为%5p,并使用[%X{X-B3-TraceId:-},%X{X-B3-SpanId:-}]
  • 在模式中的其他位置添加跟踪信息
  • 使用过滤器,使用@Value("${spring.application.name}")自动装配,然后使用MDC#put应用程序名称。

然后我意识到,这种方法只适用于HTTP请求,但没有别的,所以这还不够好,因为应用程序也使用与JMS / Spring Cloud Stream的异步通信。

然后我想到将应用程序名称添加到MDC,包括一个ApplicationContextInitializer,它认为它可以用于所有用例(HTTP请求,消息传递等)。但遗憾的是,在应用程序启动期间,日志的值已经存在,然后HTTP请求已经消失了(还没有尝试过消息,但直觉感觉它不会出现在那里其一)。

所以问题是,因为我有点卡住而且不知道还有什么去看,什么是获得价值的最佳方法/机制spring.application.name进入MDC,以便它可以出现在每个日志中?

提前致谢!

1 个答案:

答案 0 :(得分:1)

足以在bootstrap.yml中提供名称。这样,您将在所有日志中看到spring应用程序名称。