总所周知,spring boot的启动错误可以很大程度上依赖于spring boot本身提供的错误信息来定位
就比如下面这个错误:
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2020-05-27 11:43:14.085 ERROR 40352 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
Failed to bind properties under 'spring.datasource' to javax.sql.DataSource:
Property: spring.datasource.filters
Value: stat,wall,log4j
Origin: class path resource [application.yml]:21:14
Reason: org.apache.log4j.Priority
Action:
Update your application's configuration
java.lang.IllegalStateException: Failed to load ApplicationContext
它都挑明了Property、Value、Origin、Reason
甚至都还给出了Action:Update your application’s configuration
大致的意思就是在application.yml这个配置文件中,spring.datasource.filters这个属性获取到了stat,wall,log4j这些值,其中org.apache.log4j.Priority有问题。
那问题其实就已经很明确了:log4j
在这可以看到这个注释也是尝试之一,但它并不是问题的关键
@Configuration
//@EnableConfigurationProperties
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druid(){
return new DruidDataSource();
}
}
那直接用Diagrams -> Show Dependencies
,当然你也可以用快捷键:Ctrl+Alt+Shift+U
找到日志框架的部分,这里就可以看到:
既然问题已经定位到日志框架上,那解决思路就有两个:
- 要么添加log4j的日志框架;
- 要么把log4j改成已有的日志框架(log4j2、slf4j)
那首先就试试添加log4j的框架:
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
看看运行结果:
这是啥?原来是缺少log4j的配置文件,好吧我搞一个。。。
log4j:WARN No appenders could be found for logger (druid.sql.Connection).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
那我就在classpath下添加一个文件名叫log4j.properties的文件,并写入以下内容:
### set log levels ###
log4j.rootLogger = debug , stdout# , D , E
### 输出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n
#### 输出到日志文件 ###
#log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
#log4j.appender.D.File = logs/log.log
#log4j.appender.D.Append = true
#log4j.appender.D.Threshold = DEBUG ## 输出DEBUG级别以上的日志
#log4j.appender.D.layout = org.apache.log4j.PatternLayout
#log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
#
#### 保存异常信息到单独文件 ###
#log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
#log4j.appender.D.File = logs/error.log ## 异常日志文件名
#log4j.appender.D.Append = true
#log4j.appender.D.Threshold = ERROR ## 只输出ERROR级别以上的日志!!!
#log4j.appender.D.layout = org.apache.log4j.PatternLayout
#log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
以上,这是第一种解决方式:添加log4j日志框架
那么接下来,试一下第二的方式,把spring.datasource.filters中的log4j改为log4j2或者slf4j
spring:
datasource:
filters: stat,wall,log4j2
spring:
datasource:
filters: stat,wall,slf4j
注意: 记得把pom.xml中的log4j依赖移除/注释掉
下面是运行结果: