SpringBoot系列之日誌框架介紹及其原理簡介

SpringBoot系列之日誌框架介紹及其原理簡介html

一、經常使用日誌框架簡介

市面上經常使用日誌框架:JUL、JCL、jboss-logging、logback、log4j、log4j二、slf4j、etc.java

其中日誌門面,也是一系列接口api的有slf4j(Simple Logging Facade for Java)、JCL(Jakarta Commons Logging)、jboss-logginspring

注意:經常使用的slf4j等只是一日誌門面,是一個日誌的抽象層,非日誌實現,具體的實現用經過log4j或者logback等框架去實現api

二、在項目中使用slf4j

日誌調用的,仍是建議引入slf4j對應的jar和其實現框架log4j或者logback,而後調用的仍是以下進行調用,配好日誌實現框架的配置,就能夠進行日誌跟蹤springboot

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld {
  public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    logger.info("Hello World");
  }
}

slf官方手冊:slf4j官方手冊連接框架

如圖來自slf4j官方的圖,圖例已經很好的介紹了slf4j的使用場景:maven

  • 如左一圖示,直接導slf4j API工程是不能實現日誌打印的
  • logback的使用,須要導入slf4j API工程和其實現logback-classic.jar、logback-core.jar
  • log4j的使用,一樣導入slf4j API工程,還要再加比較關鍵的適配層jar:slf4j-log412.jar,而後log4j.jar才能適配slf4j
  • JTL(java util logging)也是經過適配層的slf4j-jdk14.jar先進行適配,而後jtl框架才能正常實現slf4j的api
  • etc.
    在這裏插入圖片描述spring-boot

    三、系統日誌統一到slf4j

    ok,學到這裏應該有個疑問?在Spring項目中,好比Spring framework框架,Hibernate etc.,這些框架是否有本身的日誌實現,很顯示,基本每一個框架都有本身的日誌實現,好比,spring framework就是使用commons-logging進行日誌打印的,而Hibernate是經過(jboss-logging)的,etc.,因此這麼一堆日誌框架堆在一個項目中,是否能夠實現統一的日誌打印?好比統一到實現slf4j門面學習

在slf4j官網:http://www.slf4j.org/legacy.html,這個頁面已經提供了比較合理的兼容統一實現
如官網的圖例所示,主要提供引入一些橋接的jar,好比JCL框架能夠引入jcl-over-slf4j.jar
log4j能夠引入log4j-over-slf4j.net

官方說法:
爲了簡化從JCL到SLF4J的遷移,SLF4J發行版包括jar文件jcl-over-slf4j.jar。該jar文件旨在替代JCL

注意問題:
jcl-slf4j.jar,這個jar須要注意了,使用過程不要和jcl-over-slf4j一塊兒用

jcl-over-slf4j.jar不該與slf4j-jcl.jar混淆
JCL-over-SLF4J(即jcl-over-slf4j.jar)在出於向後兼容性緣由而須要支持JCL的狀況下很是有用。它能夠用於解決與JCL相關的問題,而沒必要採用SLF4J API,該決定能夠推遲到之後。
另外一方面,在爲組件採用SLF4J API 以後,slf4j-jcl.jar頗有用 ,該組件須要嵌入在正式要求JCL的更大的應用程序環境中。您的軟件組件仍可使用SLF4J API,而不會破壞大型應用程序。實際上,slf4j-jcl.jar會將全部日誌記錄決策委派給JCL,以便您的組件對SLF4J API的依賴關係對於更大的總體而言是透明的。
請注意,不能同時部署jcl-over-slf4j.jar和 slf4j-jcl.jar。前一個jar文件將使JCL將日誌記錄系統的選擇委派給SLF4J,後一個jar文件將使SLF4J將日誌記錄系統的選擇委派給JCL,從而致使無限循環。

ok,對於log4j-over-slf4j.jar使用過程一樣注意

log4j-over-slf4j.jar和slf4j-log4j12.jar不能同時存在
slf4j-log4j12.jar的存在(即SLF4J的log4j綁定)將強制將全部SLF4J調用委派給log4j。log4j-over-slf4j.jar的存在將把全部log4j API調用委派給它們的SLF4J等效項。若是二者同時存在,則slf4j調用將委派給log4j,而log4j調用將重定向到SLF4j,從而致使無限循環。

在這裏插入圖片描述
對於這些居然的jar是如何實現偷樑換柱的?咱們能夠點開對應的jar,如圖所示:這個jar的包名命名都和jcl的同樣,目的是實現偷樑換柱,強制不使用jcl的api,而實現slf4j
在這裏插入圖片描述

在這裏插入圖片描述
ok,能夠概括統一項目使用slf4j的過程,首先系統仍是用排除其它日誌實現jar,而後引入橋接的jar,等覆蓋了以後,就能夠加上對應的實現jar包,實現日誌打印

四、Springboot日誌場景啓動器

ok,有了前面的知識後,咱們能夠繼續學習Springboot的日誌實現了,從前面的知識能夠知道,slf4j只是一個日誌門面工程,並不是實現,在不少項目裏都有日誌框架混用的狀況,針對此種起來,能夠加入一些橋接的偷樑換柱jar,而後再加上對應的實現jar就能夠

而後Springboot其實也是相似這種實現,首先,Springboot默認使用slf4j做爲門面工程,在實現過程也是有用這些偷樑換柱的橋接jar進行slf4j統一,而後再引用logback做爲日誌實現的jar,先快速建立一個Springboot項目:Springboot系列之快速建立項目教程

建立好項目以後,是默認會引入日誌框架的,首先在pom文件,右鍵->maven->show dependencies顯示jar依賴圖

如圖所示,Springboot的場景啓動項目spring-boot-strater集成了spring-boot-strater-logging,spring-boot-strater-logging都是以logback爲默認的日誌實現框架,固然本博客是以Springboot2.2.1.RELEASE版本爲例子的
在這裏插入圖片描述
固然每一個版本的實現略有不一樣,不過基本都一致,給出尚硅谷老師給的圖片:
在這裏插入圖片描述
ok,Springboot項目已經對日誌作了一個比較好的兼容,還有一個日誌jar衝突問題須要注意,由於Springboot項目是統一爲slf4j門面的,很顯然Springboot在項目實現中就已經作了其它日誌jar門面的排除,好比spring項目就已經將jcljar排除了,如圖:
在這裏插入圖片描述

因此,在項目使用中,引入其它的jar,都要考慮是否有對應的日誌實現jar,要作必要的排除,以避免形成jar衝突

ok,這篇博客是對經常使用日誌框架的介紹,有了這些必要的知識以後,就能夠實踐一下了,詳情的能夠參數個人博客,SpringBoot系列日誌框架使用教程

相關文章
相關標籤/搜索