背景

最近有业务同学反馈SpringBoot的项目日志不见了,或者是日志打印不出来的情况.

追本溯源

我们的项目默认日志都是打印在 ${user.home}/code目录下的。 所以在SpringBoot的properties配置中会申明

  1. logging.path=${user.home}

按照我们的理解,SpringBoot会在运行时解析 ${user.home} , 然后将日志打印到这里去。但是查看的实际情况却入下图所示.
image.png
发现 logging.path 已经被编译成 /Users/admin 了,说明它是在编译的时候就被maven替换掉了,而执行maven编译进程的user.home 刚好就是 /Users/admin

原因找到了,接下来的就好办了,看看我们的pom文件是怎么让maven编译的.

  1. <profile>
  2. <id>test</id>
  3. <properties>
  4. <activatedProperties>test</activatedProperties>
  5. </properties>
  6. <build>
  7. <resources>
  8. <resource>
  9. <directory>src/main/resources</directory>
  10. <excludes>
  11. <exclude>application*.properties</exclude>
  12. </excludes>
  13. </resource>
  14. <resource>
  15. <directory>src/main/resources</directory>
  16. <filtering>true</filtering>
  17. <includes>
  18. <include>application.properties</include>
  19. <include>application-${activatedProperties}.properties</include>
  20. </includes>
  21. </resource>
  22. </resources>
  23. </build>
  24. </profile>

看到这个写法的意思是: 把所有 properties 文件排除掉。最终 classpath 下只包含 application.propertiesapplication-${activatedProperties}.properties 文件,这里 activatedProperties 就是 test ,所以最终会留下来了 application-test.properties . 而这2个文件都会被maven进行编译,导致 ${} 的数据就被maven替换掉了.

知道原因了,下一步就好办了,只要不让这个文件被maven编译,同时又将它放置到 classpath下即可。 修改为如下.

  1. <profile>
  2. <id>test</id>
  3. <properties>
  4. <activatedProperties>test</activatedProperties>
  5. </properties>
  6. <build>
  7. <resources>
  8. <resource>
  9. <directory>src/main/resources</directory>
  10. </resource>
  11. <resource>
  12. <directory>src/main/resources</directory>
  13. <filtering>true</filtering>
  14. <includes>
  15. <include>application.properties</include>
  16. </includes>
  17. </resource>
  18. </resources>
  19. </build>
  20. </profile>

classpath包含所有的.properties文件,但是为了注入spring.profiles.active值,只编译application.properties 文件。

再来看结果. 完美。
image.png

结论

maven 会将编译文件中的 ${} 符号使用环境变量/系统变量进行替换。 如果不需要改变则不让它编译即可.