logback日志框架源碼分析

目錄

(一)入口:slf4j選擇日志框架

(二)日志框架初始化

(1)logback的3種配置方式

a、BasicConfigurator默認配置

b、SPI方式配置的Configurator實現類

c、通過配置文件初始化

(2)xml配置文件初始化

(三)Logger的創建

(四)打印日志


本文源碼基于:logback版本:1.2.11

在我們使用logback日志框架時,通常都會通過配置logback.xml定制化我們的日志需求。但你是否對loback日志如何加載配置感到好奇?如果沒有logback.xml,logback的默認配置又是什么樣的?配置文件中定義的appender和logger又是什么關系呢?在這一篇章我們會通過深入logback源碼進行分析

(一)入口:slf4j選擇日志框架

logback也是基于slf4j的一個日志框架實現。可以從maven的依賴中可以看到logback-classic依賴了slf4j-api。

 所以我們使用logback日志也是使用slf4j的接口:

private static final Logger logger = LoggerFactory.getLogger(LogTest.class);

而日志的配置加載就在首次調用LoggerFactory.getLogger時進行,具體是在LoggerFactory.getLogger-》getILoggerFactory():獲取LoggerFactory時進行初始化,可以看到一個如下的performInitialization()方法。從名字可以看出這個方法就是去執行初始化的,而且使用狀態位保證只初始化一次

我們接著看performInitialization方法中的bind方法:

我們知道slf4j只是定義了日志的接口,是一個日志接口協議。它將具體的日志框架實現交給各個日志框架,比如log4j2、logback等主流日志框架。這樣在使用的時候,我們都是統一使用slf4j的接口,如果我們需要替換日志框架,那么只需要切換依賴,以及加上對應日志框架的配置日志就行。而之所以切換如此絲滑,就在于slf4j內部實現了日志框架實現的自動發現,即上圖標紅位置。

它的自動發現也很簡單,只是去查找org/slf4j/impl/StaticLoggerBinder.class這個類,這個就是slf4j和具體實現框架的一個約定。如果我們想自己實現一個基于slf4j的日志框架實現,那么首先我們就得提供這么一個靜態日志綁定類。

上面只是發現靜態日志綁定類,如果有多個(可能同時引入了多個slf4的日志實現框架),那么會輸出錯誤日志到控制臺。并沒有實際發生任何綁定動作。

實際的綁定動作是執行StaticLoggerBinder.getSingleton();

這里哪個日志框架的StaticLoggerBinder類被調用,就實際用哪個日志框架實現。

(二)日志框架初始化

上面已經講了slf4j如何選擇日志框架,最終取決于StaticLoggerBinder是哪個日志框架,這也是logback 初始化的入。接下來講講logback實際的初始化。

StaticLoggerBinder將綁定ILoggerFactory,使用單例模式,通過StaticLoggerBinder.getSingleton().getLoggerFactory()獲取ILoggerFactory對象。它的初始化是在靜態代碼塊中調用單例的初始化方法:SINGLETON.init();

它初始化了一個ContextInitializer,并傳入StaticLoggerBinder中的默認LoggerContext,所有的初始化配置都是LoggerContext管理,實際上getLoggerFactory也是返回的此對象,所以它實際也是logger的工廠類。之后調用autoConfig,進行配置。我們重點看一下autoConfig:

(1)logback的3種配置方式

從上述代碼可以看到3種配置方式的選擇順序:一個是通過獲取配置文件,如果沒有配置文件,那么就嘗試加載SPI方式配置的Configurator實現類。如果也沒有,那么會使用默認BasicConfigurator。三種配置都有兩個關鍵步驟:

configurator.setContext(loggerContext);
configurator.doConfigure(loggerContext);

首先設置日志上下文,因為所有的配置都是圍繞上下文的,所以它是配置器不可或缺的。第二步就是調用doConfigure,執行上下文執行實際的配置。

下面我們從簡單到復雜一一介紹:

a、BasicConfigurator默認配置

默認配置很簡單:

將ConsoleAppender附加到root logger,ConsoleAppender的layout設置為TTLLLayout,它等同于%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"。所以它等同于使用如下配置文件:

<configuration><!-- Appenders --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!-- Root Logger --><root><appender-ref ref="CONSOLE"/></root>
</configuration>

日志級別沒有指定,默認是debug級別

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64676.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64676.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64676.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

國產數據庫OceanBase從入門到放棄教程

1. 介紹 是由螞蟻集團&#xff08;Ant Group&#xff0c;原螞蟻金服&#xff09;自主研發的分布式關系型數據庫。它旨在解決海量數據存儲和高并發訪問的問題&#xff0c;特別適合金融級應用場景&#xff0c;如支付寶等對數據一致性、可靠性和性能有極高要求的服務。以下是關于…

連接Milvus

連接到Milvus 驗證Milvus服務器正在偵聽哪個本地端口。將容器名稱替換為您自己的名稱。 docker port milvus-standalone 19530/tcp docker port milvus-standalone 2379/tcp docker port milvus-standalone 192.168.1.242:9091/api/v1/health 使用瀏覽器訪問連接地址htt…

機器學習中的欠擬合

當模型不能夠準確地表達輸入與輸出的關系時&#xff0c;就是欠擬合。它在訓練集和未見過的數據都會產生高誤差率。過度擬合則在訓練集表現出低誤差率&#xff0c;只有對未見過的數據表現出高誤差率。 當模型太過于簡單時&#xff0c;它需要更多的訓練時間、更多的輸入特征、更…

安卓入門二 Kotlin基礎

Kotlin Kotlin的歷史 Kotlin由Jet Brains公司開發設計&#xff0c;2011年公布第一版&#xff0c;2012年開源。 2016年發布1.0正式版&#xff0c;并且Jet Brains在IDEA加入對Kotlin的支持&#xff0c;安卓自此又有新的選擇。 2019年谷歌宣布Kotlin成為安卓第一開發語言&#x…

淺談Cocos2djs逆向

前言 簡單聊一下cocos2djs手遊的逆向&#xff0c;有任何相關想法歡迎和我討論^^ 一些概念 列出一些個人認為比較有用的概念&#xff1a; Cocos遊戲的兩大開發工具分別是CocosCreator和CocosStudio&#xff0c;區別是前者是cocos2djs專用的開發工具&#xff0c;後者則是coco…

STM32驅動NRF24L01

一、NRF24L01的相關介紹 1.2 引腳的介紹 關于SPI的引腳就不再說了&#xff0c;這里介紹其余的兩個引腳&#xff1a; CE 模塊控制引腳&#xff1a;芯片開啟信號&#xff0c;激活RX或TX模式 IRQ 模塊中斷信號輸出引腳&#xff1a;其低電平有效&#xff0c;也就是中斷時變為低電平…

【Python】 glob批處理模塊的學習

1.什么是glob模塊&#xff1f; 在 Python 中&#xff0c;glob模塊是一個用于文件路徑名的模式匹配的工具。它使用簡單的通配符規則來匹配文件和目錄的路徑&#xff0c;這些通配符規則類似于在命令行中使用的文件搜索規則。這使得在處理文件系統中的多個文件或目錄時非常方便&am…

Android 系統 AlarmManager 系統層深度定制

Android 系統 AlarmManager 系統層深度定制 目錄 引言AlarmManager 概述AlarmManager 系統架構AlarmManager 核心代碼解讀AlarmManager 深度定制方法 修改 AlarmManagerService 修改定時任務調度策略增加定時任務類型定制內核層 修改定時觸發精度增加定時觸發類型優化定時任務…

解決vue-i18n在非.vue文件中,在其他js文件中無法使用的問題

其實很簡單&#xff0c;把i18n直接掛載到window上&#xff0c;全局可使用。下面請看詳細。 一、安裝 npm install vue-i18n9二、在vue的main.js中引入 import Vue from "vue" import VueI18n from vue-i18n Vue.use(VueI18n)//注入到所有的子組件&#xff0c;就是…

線性代數期末復習 [基礎篇]

關于第六點: AXB 在期末考試中一般A都是可逆的 我們可以先把A的逆求出來,X A ? 1 B A^-1B A?1B,或者 (A,B) -> r (E, A ? 1 B A^-1B A?1B) 如果A矩陣不可逆,轉變為方程組求解問題,假設都是二維矩陣 A(x1,x2) (b1,b2) Ax1 b1,Ax2 b2 XAB 如果A可逆,直接XB A ? 1 A^-…

C++ —— 數據類型轉換和數據類型的別名

數據類型轉換 引言自動類型轉換強制類型轉換數據類型的別名 引言 計算機進行運算時&#xff0c;要求各操作數的數據類型、大小和存儲方式都要相同。&#xff08;例如&#xff1a;8字節的整數和8字節的浮點數&#xff0c;雖然占用內存大小一樣&#xff0c;但是存儲方式不同&…

Kali 自動化換源腳本編寫與使用

1. 背景與需求 在使用 Kali Linux 的過程中&#xff0c;軟件源的配置對系統的更新與軟件安裝速度至關重要。 Kali 的默認官方源提供了安全且最新的軟件包&#xff0c;但有時由于網絡條件或地理位置的限制&#xff0c;使用官方源可能會出現速度較慢的問題。 為了解決這一問題&a…

設計模式-創建型-工廠方法模式

什么是工廠方法模式&#xff1f; 工廠方法模式&#xff08;Factory Method Pattern&#xff09;是 創建型設計模式之一&#xff0c;目的是通過定義一個用于創建對象的接口&#xff0c;讓子類決定實例化哪個類。簡而言之&#xff0c;工廠方法模式通過延遲對象的創建過程到子類來…

【Unity3D】ECS入門學習(十二)IJob、IJobFor、IJobParallelFor

IJob&#xff1a;開啟單個線程進行計算&#xff0c;線程內不允許對同一個數據進行操作&#xff0c;也就是如果你想用多個IJob分別計算&#xff0c;將其結果存儲到同一個NativeArray<int>數組是不允許的&#xff0c;所以不要這樣做&#xff0c;如下例子就是反面教材&#…

Spring 創建和管理 Bean 的原理,以及Spring 的單例模式是否線程安全?(有無狀態Bean)

Spring 是一個輕量級的開源框架&#xff0c;廣泛應用于 Java 企業級應用的開發。它提供了一個全面的、基于 IOC&#xff08;控制反轉&#xff09;和 AOP&#xff08;面向切面編程&#xff09;的容器&#xff0c;可以幫助開發者更好地管理應用程序中的對象。 Spring 創建和管理…

Docker容器鏡像制作

Docker鏡像的基本概念 1. 什么是Docker鏡像&#xff1f; Docker鏡像是一種輕量級、可執行的軟件包&#xff0c;包含運行某個應用所需的所有代碼、庫、依賴項和配置文件。它的形成是一種“打包”和“快照”過程&#xff0c;使得應用能夠在不同環境中保持一致的功能表現。 2. …

InfoNCE Loss詳解(上)

引言 InfoNCE對比學習損失是學習句嵌入繞不開的知識點&#xff0c;本文就從頭開始來探討一下它是怎么來的。 先驗知識 數學期望與大數定律 期望(expectation&#xff0c;expected value&#xff0c;數學期望&#xff0c;mathematical expectation)是隨機變量的平均值&#…

.Net加密與Java互通

.Net加密與Java互通 文章目錄 .Net加密與Java互通前言RSA生成私鑰和公鑰.net加密出數據傳給Java端采用java方給出的公鑰進行加密采用java方給出的私鑰進行解密 .net 解密來自Java端的數據 AES帶有向量的AES加密帶有向量的AES解密無向量AES加密無向量AES解密 SM2(國密)SM2加密Sm…

工作中常用Vim的命令

Hi, 我是你們的老朋友&#xff0c;主要專注于嵌入式軟件開發&#xff0c;有興趣不要忘記點擊關注【碼思途遠】 目錄 0. ctags -R 1.認識 Vim的幾種工作模式 2.高頻使用命令 2.1 修改文件 2.2 關于行號 2.3 刪除多行&#xff0c;刪除部分 2.4 復制粘貼 2.5 光標移動 2.…

如何在 Vue 2 中使用 Swiper 5.4.5 處理靜態與后端數據不能切換問題

一、文章大綱 1.前言 介紹 Swiper 作為一款強大的輪播組件,常用于處理圖片、文章、商品等內容的滑動展示。 在 Vue.js 項目中集成 Swiper,尤其是在 Vue 2 中使用,常見的兩種數據來源:靜態數據與后端數據。 在 Vue 2 項目中集成 Swiper 5.4.5 2.如何通過 npm 安裝 Swiper…