背景
最近有业务同学反馈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 会将编译文件中的 ${}
符号使用环境变量/系统变量进行替换。 如果不需要改变则不让它编译即可.