2017-05-04 72 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應用程序名稱。