spring (boot)使用log4j2實現slf4j日志門面


jcl-over-slf4j + slf4j-api + log4j-slf4j-impl + log4j-core + log4j-api

解決啟動時報錯:

No SLF4J providers were found

Failed to load class "org.slf4j.impl.StaticLoggerBinder

只想看解決報錯的點擊>>這里<<



一、Java日志框架

詳情參考1 詳情參考2

當系統逐漸復雜,System.out.println() 滿足不了我們的時候,就需要寫日志了

Java日志時間軸:

log4j(1999-2015)--> JUL(2000-)--> JCL --> slf4j --> logback(2006-) --> log4j2(2012-)

  1. log4j(作者Ceki Gülcü)出來時就等到了廣泛的應用(注意這里是直接使用),是Java日志事實上的標准,並成為了Apache的項目

  2. Apache要求把log4j並入到JDK,SUN拒絕,並在jdk1.4版本后增加了JUL(java.util.logging)

  3. 畢竟是JDK自帶的,JUL也有很多人用。同時還有其他日志組件,如SimpleLog等。這時如果有人想換成其他日志組件,如log4j換成JUL,因為api完全不同,就需要改動代碼。

  4. Apache見此,開發了JCL(Jakarta Commons Logging),即commons-logging-xx.jar。它只提供一套通用的日志接口api,並不提供日志的實現。很好的設計原則嘛,依賴抽象而非實現。這樣應用程序可以在運行時選擇自己想要的日志實現組件。

  5. 這樣看上去也挺美好的,但是log4j的作者覺得JCL不好用,自己開發出slf4j,它跟JCL類似,本身不提供日志具體實現,只對外提供接口或門面。目的就是為了替代JCL。同時,還開發出logback,一個比log4j擁有更高性能的組件,目的是為了替代log4j。

  6. Apache參考了logback,並做了一系列優化,推出了log4j2

總結,目前我們使用JCL或slf4j門面,使用logback或log4j2實現



二、日志橋接

首先看slf4j官方說日志應該如何橋接

官方文檔1

官方文檔2

Spring 框架選擇使用了 JCL 作為默認日志輸出。而 Spring Boot 默認選擇了 SLF4J 結合 LogBack

所以在Spring中我們應當使用jcl-over-slf4j + slf4j-api + log4j-slf4j-impl + log4j-core + log4j-api

在Spring Boot中我們應當去除LogBack依賴后使用jul-to-slf4j + slf4j-api + log4j-slf4j-impl + log4j-core + log4j-api

但是Spring Boot提供了更好的選擇spring-boot-starter-log4j2

從maven官網中我們可以看到它集成了log4j-slf4j-impl + log4j-core + log4j-jul + jul-to-slf4j



三、解決報錯

本文編輯於2021-12-11

第一個報錯No SLF4J providers were found

原因是slf4j-api、jcl-over-slf4j版本不對,用了2.0.0-alpha5,應該用1.7.32

第二個報錯Failed to load class "org.slf4j.impl.StaticLoggerBinder

原因是從maven官網復制的配置含有<scope>test</scope>,應該改為<scope>compile</scope>

這些報錯如果按報錯提示的鏈接去官網查看的話,都是要求引入一堆依賴進項目,但其實並不是解決根本問題,反而會以為引入混亂的依賴導致最后寫日志的不是log4j2了



四、log4j2配置文件

配置文件名為log4j2.xml,放在resources文件夾下




end

相關文章:

《jndi ldap/rmi RCE介紹:fastjsion反序列化漏洞,log4j2命令執行》

《fastjson整合到spring boot中》



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM