背景
項目中使用springboot,需要用log4j2做日志框架
問題
項目啟動報錯:Could not initialize Log4J2 logging from classpath:log4j2-dev.yml
是一個無法初始化Log4J2配置的問題,項目中采用的yml的配置文件。
前置操作
首先引入依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
去掉默認的logback配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions><!-- 去掉默認配置 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
添加配置文件:
配置logging.config
以上是整合操作的必要配置,配置完成啟動報錯。
問題排查
根據異常信息描述,找到源碼中初始化的代碼:Log4J2LoggingSystem.loadConfiguration
繼續跟進:
發現是一個抽象方法,idea中使用ctrl+alt+B查找實現類:
因為使用的是yml,所以實現類應該是YamlConfig這個,找到具體實現:
通過debug發現isActive是false,所以返回null。在此類中找到isActive的含義:
這是關鍵的邏輯,原來回去檢查是否存在上面幾個依賴的類,調試返現沒有YAMLFactory這個類,可以看出這個類是jackson包中的,看來是少依賴了包。
解決
引入jackson-dataformat-yaml依賴:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
</dependency>
啟動正常,問題解決。