需求:
為了在日志中打印出足夠詳細的信息方便集群環(huán)境中查日志,需要打印出當前的環(huán)境,是dev,test,還是prod.
思索過后想到項目每次啟動時看到的內(nèi)容:
image.png
要是可以拿到這個配置文件的名稱,就知道代碼現(xiàn)在運行在哪個環(huán)境了.于是從
SpringApplication.run()
方法開始找相關(guān)的代碼.
image.png
run方法中發(fā)現(xiàn)一個比較明顯的printbanner方法,結(jié)合控制臺的日志輸出,知道打印出配置文件的位置就在下方不遠,遂進入preparContext中,內(nèi)容如下:
image.png
看到一個異常明顯的方法,且?guī)в衛(wèi)og前綴,感覺八九不離十了,點擊進去:
image.png
看到了沒有配置profile時熟悉的提醒日志.進一步確認就是在這兒了.
line:648 通過context獲取到了生效的配置,返回結(jié)果是String[],結(jié)合
image.png
可以看到,是進入了else分支,打印出逗號分割的數(shù)組內(nèi)容.
得到結(jié)論 ----> context.getEnvironment().getActiveProfiles()
可以拿到想要的配置文件名.
接下來就是如何去拿這個context.
SpringApplication.run()
這個spring boot 啟動類中必定使用的方法其實返回了context,拿到這個context就行了.
問題是我的日志是在一個common包中使用的,這個包不是一個spring boot 的應(yīng)用,沒法這么用.
考慮到在代碼中隨時訪問context并訪問其的一些內(nèi)容有可能是常見的需求,在項目中全局搜索,看到了一個工具類如下:
image.png
這個類的結(jié)構(gòu):
image.png
定義了ApplicationContext
,并且get方法進行了賦值.那么我再定義一個方法,調(diào)用getActiveProfiles
就行了.
image.png