2017-05-04 46 views
2

我正在开发一个定制的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所以它可以出现在每一个日志?

在此先感谢!

回答

1

bootstrap.yml中提供名称就足够了。这样您将在所有日志中看到Spring应用程序名称。