因為從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>