需求:
为了在日志中打印出足够详细的信息方便集群环境中查日志,需要打印出当前的环境,是dev,test,还是prod.
思索过后想到项目每次启动时看到的内容:
image.png
要是可以拿到这个配置文件的名称,就知道代码现在运行在哪个环境了.于是从
SpringApplication.run()
方法开始找相关的代码.
image.png
run方法中发现一个比较明显的printbanner方法,结合控制台的日志输出,知道打印出配置文件的位置就在下方不远,遂进入preparContext中,内容如下:
image.png
看到一个异常明显的方法,且带有log前缀,感觉八九不离十了,点击进去:
image.png
看到了没有配置profile时熟悉的提醒日志.进一步确认就是在这儿了.
line:648 通过context获取到了生效的配置,返回结果是String[],结合
image.png
可以看到,是进入了else分支,打印出逗号分割的数组内容.
得到结论 ----> context.getEnvironment().getActiveProfiles()
可以拿到想要的配置文件名.
接下来就是如何去拿这个context.
SpringApplication.run()
这个spring boot 启动类中必定使用的方法其实返回了context,拿到这个context就行了.
问题是我的日志是在一个common包中使用的,这个包不是一个spring boot 的应用,没法这么用.
考虑到在代码中随时访问context并访问其的一些内容有可能是常见的需求,在项目中全局搜索,看到了一个工具类如下:
image.png
这个类的结构:
image.png
定义了ApplicationContext
,并且get方法进行了赋值.那么我再定义一个方法,调用getActiveProfiles
就行了.
image.png