因為從Spring Boot 1.4開始,spring boot就不支援log4j了,必須是log4j2或者logback,具體兩者如何配置以及NDC的支援可以參考spring boot精華版。
這裡要講的是如果剛好用的spring boot是1.4+或者應用使用了log4j2,但是依賴的三方使用的是log4j,該如何處理?預設情況下,如果log4j和log4j2實作都存在,spring boot啟動時會提示無法初始化log4j,類似如下:
log4j:WARN No appenders could be found for logger (org.I0Itec.zkclient.ZkConnection). log4j:WARN Please initialize the log4j system properly.
然後日志一條都不列印。。。。
其中方法之一如果三方庫依賴的是SLF4J,就把log4j12的依賴排除掉,如下:
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.12</artifactId>
<version>0.11.0.3</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
這樣使用log4j2的庫日志時可以正常列印了,三方庫依賴log4j的就會在運作期間仍然提示上述錯誤資訊。
此時如果強行把三方庫依賴的log4j直接排除掉,在啟動時會提示“
java.lang.NoClassDefFoundError: org/apache/log4j/Logger
”,這絕對是不可以接受的。
如果三方庫沒有提供依賴log4j2的版本,可将依賴的 log4j 後,然後額外加上這個 log4j-1.2-api,如下:
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.12</artifactId>
<version>0.11.0.3</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-1.2-api</artifactId>
</dependency>