我正在開發一個定製的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所以它可以出現在每一個日誌?
在此先感謝!