Spring Boot应用启动重复打印CONSOLE_LOG_PATTERN_IS_UNDEFINED警告求助
我之前在维护同版本栈的Spring Cloud应用时,也碰到过这个一模一样的问题——启动时重复刷CONSOLE_LOG_PATTERN_IS_UNDEFINED。结合Finchley.M9和Spring Boot 2.0.0.RELEASE的版本特性,这个问题主要是日志配置加载异常或者版本兼容bug导致的,下面给你几个亲测有效的解决办法:
1. 修正日志配置的YAML层级缩进
Spring Boot对YAML的格式要求特别严格,你当前的application.yml日志配置大概率存在缩进错误,导致Spring无法识别正确的控制台日志格式,才会输出占位符内容。正确的配置结构应该是:
## spring-boot配置 # 日志配置 logging: file: "log/hello.log" pattern: console: "[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level [%t] [%logger - %line]: %m%n" file: "[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level [%t] [%logger - %line]: %m%n"
注意pattern下的console和file要缩进一级,和根节点下的file是同级子节点。
2. 排除Spring Cloud组件的冲突日志配置
Finchley.M9作为里程碑版本,部分Spring Cloud组件(比如Spring Cloud Commons)自带的默认日志配置会和Spring Boot的配置冲突。你可以在pom.xml里排除相关依赖,统一日志配置的加载源:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency>
确保你的项目只依赖spring-boot-starter-logging这一个日志启动器。
3. 升级Spring Cloud到稳定版
Finchley.M9本身存在不少已知bug,日志配置问题就是其中之一。建议你升级到Finchley系列的稳定版(Finchley.RELEASE),它完全兼容Spring Boot 2.0.0.RELEASE,同时修复了里程碑版本的诸多问题:
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
4. 手动指定日志配置文件绕过自动配置
如果上面的方法都不生效,你可以直接通过启动参数指定自定义日志配置文件,彻底绕过Spring的自动配置逻辑:
java -jar your-app.jar --logging.config=classpath:logback-spring.xml
然后在src/main/resources下创建logback-spring.xml,直接定义日志格式:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level [%t] [%logger - %line]: %m%n</pattern> </encoder> </appender> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>log/hello.log</file> <encoder> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level [%t] [%logger - %line]: %m%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE"/> </root> </configuration>
内容的提问来源于stack exchange,提问作者Eric

