问题背景
某日查询日志的时候,发现日志目录下的日志文件出现XXX_IS_UNDEFINED.log,正常的日志文件名应该是xxx.log,xxx是服务名称,这个是在logback-spring.xml 配置的,配置是一个变量。
<springProperty scope="context" name="springAppName" source="spring.application.name"/>
这个配置读取application.yml的属性spring.application.name。
spring:
application:
name: order-service
问题排查
经日志分析,每次都是nacos配置发送了变化以后,触发了refresh事件,spring监听到事件会触发SpringApplicationBuilder的run方法,触发SpringApplication的run方法执行,触发spring部分初始化机制执行,其中PropertySourceBootstrapConfiguration类有涉及到日志系统重新初始化逻辑。
其中如果nacos配置如果有涉及到logging相关的配置就会导致重新初始化日志系统。
问题就出现在这里,这个时候当前环境不会重加载application.yml,只会加载bootstrap.yml文件,导致日志配置文件读取不到对应的变量。
解决方案
- 可以将logback-spring.xml配置文件读取的变量放到bootstrap.yml中这样就不会有问题了。
- 将变量配置到nacos配置中心也可以。
题外话
logback.xml的加载顺序高于application文件>logback-spring.xml,所以当我们需要配置一些日志相关的参数时候,我们需要将我们的日志配置文件修改为logback-spring.xml,或者自定义名logback-xxx.xml,然后在application文件指定日志文件(属性:
logback.config)。