背景
最近有业务同学反馈SpringBoot的项目日志不见了,或者是日志打印不出来的情况.
追本溯源
我们的项目默认日志都是打印在 ${user.home}/code目录下的。 所以在SpringBoot的properties配置中会申明
logging.path=${user.home}
按照我们的理解,SpringBoot会在运行时解析 ${user.home} , 然后将日志打印到这里去。但是查看的实际情况却入下图所示. 
发现 logging.path 已经被编译成 /Users/admin 了,说明它是在编译的时候就被maven替换掉了,而执行maven编译进程的user.home 刚好就是 /Users/admin 。
原因找到了,接下来的就好办了,看看我们的pom文件是怎么让maven编译的.
<profile><id>test</id><properties><activatedProperties>test</activatedProperties></properties><build><resources><resource><directory>src/main/resources</directory><excludes><exclude>application*.properties</exclude></excludes></resource><resource><directory>src/main/resources</directory><filtering>true</filtering><includes><include>application.properties</include><include>application-${activatedProperties}.properties</include></includes></resource></resources></build></profile>
看到这个写法的意思是: 把所有 properties 文件排除掉。最终 classpath 下只包含 application.properties 和 application-${activatedProperties}.properties 文件,这里 activatedProperties 就是 test ,所以最终会留下来了 application-test.properties . 而这2个文件都会被maven进行编译,导致 ${} 的数据就被maven替换掉了. 
知道原因了,下一步就好办了,只要不让这个文件被maven编译,同时又将它放置到 classpath下即可。 修改为如下.
<profile><id>test</id><properties><activatedProperties>test</activatedProperties></properties><build><resources><resource><directory>src/main/resources</directory></resource><resource><directory>src/main/resources</directory><filtering>true</filtering><includes><include>application.properties</include></includes></resource></resources></build></profile>
classpath包含所有的.properties文件,但是为了注入spring.profiles.active值,只编译application.properties 文件。
再来看结果.  完美。 
结论
maven 会将编译文件中的 ${} 符号使用环境变量/系统变量进行替换。 如果不需要改变则不让它编译即可. 
