我正在开发一个定制的spring启动启动器,目的是为我们的分布式系统中的所有spring启动应用程序提供自动配置,所以这样,每个当需要更改配置时,可以在一个位置完成配置,而不是遍历所有应用更改的不同应用程序,而只是依赖版本的版本更新就足够了。Spring Boot定制启动器用于日志记录和分布式跟踪
因为我要盖被记录并分发跟踪,现在坚持的logback,但在未来的提供也log4j2支持的思想主题,启动包括以下依存关系:
spring-boot-starter-web
spring-cloud-starter-sleuth
我对这个问题先取是包括logback.xml
文件中启动的自动配置模块的src/main/resources
文件夹,并且使用启动器的应用程序将获得配置。
时遇到的问题是,当猎犬是在类路径,当EnvironmentPostProcessor更新与[app name, traceId, spanId, exported]
元组电平模式,在显示的应用程序的名称是bootstrap
而不是用在应用程序中spring.application.name
定义的名称。使用入门应用的YML文件,不知道为什么,找不到的原因:(
这样一个线索,来解决这个问题,我做了以下内容:
- 替换模式
${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所以它可以出现在每一个日志?
在此先感谢!