Spring Boot启动生成application.name_IS_UNDEFINED.log文件的原因排查
问题原因
这个application.name_IS_UNDEFINED.log文件是Logback与Spring上下文的初始化顺序错位导致的:
- Logback自身的初始化时机早于Spring环境变量的加载完成时机
- 你在logback-spring.xml中通过
<springProperty>注入spring.application.name给${application.name}变量,当Logback初始化文件输出Appender时,Spring还未完成该属性的注入,Logback找不到对应变量值,就会自动使用变量名_IS_UNDEFINED作为占位符生成日志文件 - 你看到的单条Hibernate Validator初始化日志,触发时机恰好处于Spring上下文未完全就绪、Logback已启动的间隙,因此被输出到了这个临时生成的占位符命名文件中;后续Spring属性注入完成后,正常的应用名命名日志文件才会开始记录后续日志。
修复方案
方案1:给springProperty配置默认值
修改<springProperty>标签,新增defaultValue属性,避免属性未加载完成时生成占位符命名文件:<springProperty scope="context" name="application.name" source="spring.application.name" defaultValue="application"/>初始化阶段会先生成
application.log,后续属性注入完成后会自动替换为正确的应用名日志文件,不会产生多余文件。方案2:开启Appender懒加载
给文件输出Appender添加lazy="true"属性,让Appender等Spring上下文完全加载完成后再初始化:<appender name="FILE" class="ch.qos.logback.core.FileAppender" lazy="true"> <!-- 其余原有配置保持不变 --> <file>${application.name}.log</file> ... </appender>该方案可以从根源避免初始化阶段变量未就绪的问题。
方案3(Spring Cloud项目适用):将应用名配置到bootstrap配置文件
bootstrap.yml/bootstrap.properties的加载优先级远高于普通application配置,会在Logback初始化前完成加载,提前配置spring.application.name即可保证Logback初始化时能正常拿到变量值。
内容的提问来源于stack exchange,提问作者Steve B
相关产品推荐
相关产品推荐

