【Logback】Logback 的配置文件

目錄

一、初始化配置文件

1、logback 配置文件的初始化順序

2、logback 內部狀態信息

二、配置文件的結構

1、logger?元素

2、root?元素

3、appender?元素

三、配置文件中的變量引用

1、如何定義一個變量

2、為變量設置默認值

3、變量的嵌套


? ? In symbols one observes an advantage in discovery which is greatest when they express the exact nature of a thing briefly and, as it were, picture it; then indeed the labor of thought is wonderfully diminished.

????????—GOTTFRIED WILHELM LEIBNIZ

? ? ? ? 大致意思是:使用符號的最大優勢,就是符號可以非常清晰、簡潔的描繪一個事務的本質,從而可以極大的減少思想勞動的支出。

//我把這段文字貼在這里,因為它闡釋了配置文件的本質

????????Logback 的配置依賴于 Joran 配置框架,這個框架后邊如果有時間我會扒一下源碼后再進行分享,此處,重點探討 Logback 配置文件的相關內容。

一、初始化配置文件

1、logback 配置文件的初始化順序

????????首先讓我們來看一下?logback 嘗試加載配置時所遵循的初始化步驟:

????????(1)查找自定義的?Configurator

????????Logback 會優先加載自定義的配置器(Configurator),所謂自定義配置器,就是實現了?ch.qos.logback.classic.spi.Configurator 接口的類。

????????Logback 中提供了兩個?Configurator 接口的實現類,一個是?DefaultJoranConfigurator(加載logback.xml文件的配置器),另一個是?BasicConfigurator(默認配置器)。

????????(2)實例化 SerializedModelConfigurator 配置器

????????如果在 Logback 沒有找到用戶提供的自定義配置器,logback 將實例化一個 SerializedModelConfigurator。這是一個序列化模型文件的加載器,加載的文件名稱為:"logback-test.scmo"?或 "logback.scmo"。

????????序列化模型文件的配置執行速度更快,并且不需要任何 XML 庫。與 GraalVM 結合使用,可以產生更小的可執行文件,啟動速度更快。這個加載器我在 Logback 的核心包中沒有找到對應的類,所以暫時不深入分析,了解即可。

????????如果找不到序列化配置模型文件,SerializedModelConfigurator 將返回一個執行狀態,要求調用下一個可用的配置器,即創建并調用 DefaultJoranConfigurator 的實例。

????????(3)執行 DefaultJoranConfigurator 配置器(重點步驟)

? ? ? ? 首先,DefaultJoranConfigurator 會嘗試查找?“logback.configurationFile” 系統屬性上指定的文件。如果可以找到該文件,則會讀取并解釋該文件,然后進行配置。

????????如果沒有找到上述文件,DefaultJoranConfigurator 將嘗試在類路徑上查找配置文件 “logback-test.xml” 。如果可以找到該文件,則會讀取并解釋該文件,然后進行配置。

????????如果沒有找到上述文件,配置器將繼續嘗試在類路徑中查找配置文件 “logback.xml” 。如果可以找到該文件,則會讀取并解釋該文件,然后進行配置。

????????如果找不到配置文件,DefaultJoranConfigurator 將返回一個執行狀態,要求調用下一個可用的配置器,即創建并調用 BasicConfigurator 的實例。

? ? ? ? //從這里可以看出,“logback-test.xml” 文件優先于?“logback.xml” 文件生效。

????????(4)執行 BasicConfigurator 配置器(使用默認配置)

????????如果上述配置文件查找均不成功,logback-classic 將使用 BasicConfigurator 進行自身配置,默認配置會使日志定向輸出到控制臺。執行 BasicConfigurator 配置器,是為了在沒有配置文件的情況下,logback 能夠正常使用日志記錄功能。//默認配置的作用

????????//從 logback 配置文件加載過程來看,就是使用了一串配置器鏈(責任鏈模式)

2、logback 內部狀態信息

????????之前在《如何在項目中快速引入Logback日志?》這篇文章中提到過如何打印 logback 的內部狀態信息,?這些信息在對 logback 相關的問題進行診斷時非常有用。文章中,我們使用程序代碼的方式對狀態信息進行打印,除此之外,還可以使用配置文件的方式。

????????使用配置文件,本質上就是在配置文件中配置一個狀態監聽器(StatusListener),如果我們只是想把內部信息打印在控制臺上,那么就可以配置一個?OnConsoleStatusListener,配置信息如下:

<configuration><!-- 建議: 將狀態偵聽器置于配置文件的頂部 --><statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" /><!-- ... 配置文件的剩余部分 --></configuration>

????????為什么建議將狀態偵聽器置于配置文件的頂部呢?

????????這是因為,已注冊的狀態偵聽器將僅接收其注冊后的狀態事件。它不會接收之前的消息。因此,最好將狀態偵聽器注冊指令放置在配置文件頂部的其他指令之前。

? ? ? ? 此外,配置 OnConsoleStatusListener 還有一種更簡潔的方式,直接在?<configuration> 標簽中,將 debug 屬性設置為 true 就可以注冊 OnConsoleStatusListener,如下所示:

<configuration debug="true"><!-- ... 配置文件內容部分 --></configuration>

二、配置文件的結構

????????logback 的配置文件非常靈活,且不需要使用 DTD 文件或 XML 模式指定的語法。其配置文件的基本結構可以描述為:<configuration>?元素,包含零個或多個 <appender> 元素,后邊可以跟零個或多個 <logger> 元素,最后最多跟隨一個 <root> 元素。下圖說明了這個基本結構。

????????logback.xml 配置文件的一般格式內容如下:

<configuration debug="true"> <!--configuration 標簽--><!--1、appender 標簽--><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!--2、logger 標簽--><logger name="self4.Example" level="INFO" additivity="false"><!--注意:當additivity="true"時可能會重復添加--><!--當與root重復添加時,日志會被打印兩次,因為有兩個一樣的appender--><appender-ref ref="STDOUT" />  </logger><!--3、root 標簽--><root level="debug"><appender-ref ref="STDOUT"/></root></configuration> 

1、logger?元素

????????顧名思義,<logger> 元素就是用來配置?logger?的標簽<logger> 標簽只有三個屬性,分別為:name(記錄器限定名),level(日志級別),additivity(是否追加)。此外,<logger> 元素可以包含零個或多個 <appender-ref> 元素;該元素可以將 appender?添加到指定的記錄器中。

????????其配置示例,可以參考上邊 logback.xml 配置文件的一般格式的內容。

????????使用 <logger> 標簽可以分別對不同的?logger?設置不同的?level?級別,如果不設置?<logger> 標簽,那么所有的?logger 都會繼承根 logger 的配置,也就是?<root> 標簽的配置。

????????有關 logger?繼承的詳細內容,我在這篇文章《Logback 日志框架的架構》中有介紹,可做參考。

2、root?元素

????????<root> 元素用來配置根記錄器(root logger),該標簽只支持單一屬性的 level 屬性

? ? ? ? 因為根記錄器是最頂層的記錄器,所以它沒有可追加屬性(additivity),同時,根記錄器已經被命名為 “ROOT”,因此它也不允許使用名稱屬性(name)。此外,<root> 元素可以包含零個或多個 <appender-ref> 元素;該元素可以將 appender?添加到根記錄器中。

3、appender?元素

????????<appender> 元素用來配置?appender,該標簽有兩個強制屬性 name 和 class。所謂強制就是必須要配置的意思,其中 name 用來指定 appender 的名稱,class 用來指定要實例化的 appender 類的完全限定名稱。

????????<appender> 元素可以包含零個或一個 <layout> 元素、零個或多個 <encoder> 元素以及零個或多個 <filter> 元素。除了這三個公共元素之外,<appender> 元素還可以包含與 appender 類的 JavaBean 屬性相對應的任意數量的元素。//也就是說Appender實例中的一些屬性也可以在配置文件中進行配置

????????下圖說明了<appender> 元素常見的結構。

????????<layout> 元素采用強制的 class 屬性,要求必須指定要實例化的布局類的完全限定名稱。與 <appender> 元素一樣,<layout> 可以包含與布局實例的屬性相對應的其他元素。由于?<layout> 元素經常被配置,所以如果布局類是 PatternLayout,則可以根據默認的類映射規則省略 class 屬性//指定字符串的打印格式

????????<encoder> 元素也采用強制的 class 屬性,同?<layout> 元素一樣,它也具有默認的映射,如果編碼器類是 PatternLayoutEncoder,則可以按照默認的類映射規則省略 class 屬性

????????簡要的示例配置內容如下所示:

<configuration><appender name="FILE" class="ch.qos.logback.core.FileAppender"><file>myApp.log</file><encoder><pattern>%date %level [%thread] %logger{10} [%file:%line] -%kvp- %msg%n</pattern></encoder></appender><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%kvp %msg%n</pattern></encoder></appender><root level="debug"><appender-ref ref="FILE" /><appender-ref ref="STDOUT" /></root>
</configuration>

三、配置文件中的變量引用

????????與許多腳本語言一樣,logback 配置文件也支持對變量進行定義和引用。變量可以定義在配置文件的內部,也可以定義在配置文件的外部(不推薦),甚至還可以動態的進行計算和定義。

????????引用一個變量,可以使用 "${name}" 這種格式,"${name}" 會被解釋為對 name 的屬性值的引用。

1、如何定義一個變量

????????由于歷史原因,在配置文件中定義一個變量,logback 1.0.7 版本之前使用? <property> 標簽,logback 1.0.7 及以后的版本中可以使用?<variable> 標簽,當然也可以使用? <property> 標簽(兼容性)。

????????在配置文件中定義變量的內容如下:

<configuration><!--定義一個變量,變量名稱為USER_HOME --><variable name="USER_HOME" value="/home/sebastien" /><appender name="FILE" class="ch.qos.logback.core.FileAppender"><!--引用定義的變量--><file>${USER_HOME}/myApp.log</file><encoder><pattern>%kvp %msg%n</pattern></encoder></appender><root level="debug"><appender-ref ref="FILE" /></root>
</configuration>

????????如果想將變量定義在外部文件中,可以使用如下配置:

<configuration><!--引入外部文件--><variable file="src/main/java/chapters/configuration/variables1.properties" /><appender name="FILE" class="ch.qos.logback.core.FileAppender"><file>${USER_HOME}/myApp.log</file> <!--引入外部文件中的USER_HOME變量值--><encoder><pattern>%kvp %msg%n</pattern></encoder></appender><root level="debug"><appender-ref ref="FILE" /></root>
</configuration>

????????外部文件 variables1.properties 中的內容如下://鍵值對

USER_HOME=/home/sebastien

2、為變量設置默認值

????????在某些情況下,如果變量未被聲明或者它的值為 null 時,則可能希望變量具有默認值。在?logback 配置中,可以使用 " :- "?運算符來指定默認值,比如,名為 name 的變量沒有被定義,那么 "{name:-golden}" 將被解釋為 "golden"

3、變量的嵌套

????????logback?的配置完全支持變量的嵌套。變量的名稱、默認值和值的定義都可以引用其他變量。

????????變量值的定義可以包含對其他變量的引用,比如:

#定義的變量
USER_HOME=/home/sebastien
fileName=myApp.log#該變量值的定義可以引用其他變量
destination=${USER_HOME}/${fileName} 

????????變量名稱的定義也可以包含對其他變量的引用,比如,如果為名為 "userid" 的變量的值為:"swadian",則 "${${userid}.password}" 引用是變量名為 "swadian.password" 的值。

????????變量默認值的定義同樣也可以包含對其他變量的引用,例如,如果變量 "id"?未被分配值,并且變量 "userid" 的值為 "swadian",則表達式 "${id:-${userid}}" 將返回 "swadian"。

? ? ? ? 當然,logback 配置中還有許多值得探討的內容,但因為時間和篇幅有限,我們只探討了一些常用的配置項,其他詳細內容可以點擊此處查閱官方文檔。

????????至此,全文結束。

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

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

相關文章

Swift的基本數據類型

1. Int類型&#xff1a;用于表示整數&#xff0c;包括正整數和負整數。 let age: Int 30 let numberOfStudents 50 2. Double和Float類型&#xff1a;用于表示浮點數&#xff0c;即帶有小數點的數值。Double提供更高的精度&#xff0c;而Float提供較低的精度。 let pi: Do…

如何壓縮word文檔中的圖片大小?一鍵批量壓縮~

在日常工作和學習中&#xff0c;我們經常需要創建和編輯Word文檔&#xff0c;并在其中插入圖片來豐富內容。然而&#xff0c;隨著圖片的增加&#xff0c;Word文檔的大小可能會急劇增加&#xff0c;導致文件變得龐大&#xff0c;不便于傳輸和共享。針對這個問題&#xff0c;本文…

C++/WinRT教程(第四篇)WinRT 的錯誤和異常處理

目錄 前言 避免捕獲和拋出異常 捕獲異常 拋出異常 編輯API時拋出異常 使用 noexcept 時如何調試 調用同步代碼 快速失敗 斷言 前言 本文主要介紹 C/WinRT 中的異常如何使用以及使用原則&#xff0c;如果你剛開始接觸WinRT&#xff0c;建議先閱讀第一篇。 C/WinRT教程…

67-箭頭函數,new.target,模版字符串

1.箭頭函數 ES6新增語法&#xff0c;用來簡化函數的書寫()>{} <script>//箭頭函數的基本使用let a (a,b)>{return ab;}let c a(1,2);console.log(c);//輸出3</script> 2.簡寫形式&#xff1a; 2.1參數&#xff1a;只有一個參數時可以省略小括號a>{}&…

面試經典 150 題 ---- 輪轉數組

面試經典 150 題 ---- 輪轉數組 輪轉數組方法一&#xff1a;使用額外的數組方法二&#xff1a;數組翻轉 輪轉數組 方法一&#xff1a;使用額外的數組 我們可以使用額外的數組來將每個元素放至正確的位置。用 n 表示數組的長度&#xff0c;我們遍歷原數組&#xff0c;將原數組…

Java底層自學大綱_JVM篇

JVM專題_自學大綱所屬類別學習主題建議課時&#xff08;h&#xff09; A 深入理解Java虛擬機001 JVM類加載器設計原理2.5 A 深入理解Java虛擬機002 基于SPI破解雙親委派機制2.5 A 深入理解Java虛擬機003 JVM內部結構分析2.5 A 深入理解Java虛擬機004 字符串常量池原理2.5 …

【算法】長短期記憶網絡(LSTM,Long Short-Term Memory)

這是一種特殊的循環神經網絡&#xff0c;能夠學習數據中的長期依賴關系&#xff0c;這是因為模型的循環模塊具有相互交互的四個層的組合&#xff0c;它可以記憶不定時間長度的數值&#xff0c;區塊中有一個gate能夠決定input是否重要到能被記住及能不能被輸出output。 原理 黃…

37.云原生之springcloud+k8s+GitOps+istio+安全實踐

云原生專欄大綱 文章目錄 準備工作項目結構介紹配置安全測試ConfigMapSecret使用Secret中數據的方式Deployment使用Secret配置Secret加密 kustomize部署清單ConfigMap改造SecretSealedSecretDeployment改造Serviceistio相關資源DestinationRuleGatewayVirtualServiceServiceAc…

132557-72-3,2,3,3-三甲基-3H-吲哚-5-磺酸,具有優異的反應活性和光學性能

132557-72-3&#xff0c;5-Sulfo-2,3,3-trimethyl indolenine sodium salt&#xff0c;2,3,3-三甲基-3H-吲哚-5-磺酸&#xff0c;具有優異的反應活性和光學性能&#xff0c;一種深棕色粉末 您好&#xff0c;歡迎來到新研之家 文章關鍵詞&#xff1a;132557-72-3&#xff0c;5…

ROS2體系框架

文章目錄 1.ROS2的系統架構2.ROS2的編碼風格3.細談初始化和資源釋放4.細談配置文件5.ROS2的一些命令6.ROS2的核心模塊6.1 通信模塊6.2 功能包6.3 分布式6.4 終端命令和rqt6.5 launch6.6 TF坐標變換6.7 可視化RVIZ 1.ROS2的系統架構 開發者的工作內容一般都在應用層&#xff0c;…

MySQL學習Day24—數據庫的設計規范

一、數據庫設計的重要性: 1.糟糕的數據庫設計產生的問題: (1)數據冗余、信息重復、存儲空間浪費 (2)數據更新、插入、刪除的異常 (3)無法正確表示信息 (4)丟失有效信息 (5)程序性能差 2.良好的數據庫設計有以下優點: (1)節省數據的存儲空間 (2)能夠保證數據的完整性 …

力扣138.隨機鏈表的復制

給你一個長度為 n 的鏈表&#xff0c;每個節點包含一個額外增加的隨機指針 random &#xff0c;該指針可以指向鏈表中的任何節點或空節點。 構造這個鏈表的 深拷貝。 深拷貝應該正好由 n 個 全新 節點組成&#xff0c;其中每個新節點的值都設為其對應的原節點的值。新節點的 n…

編寫一個自動合并代碼到不同分支的腳本小工具

新建一個 autoMerge.sh 的文件&#xff0c;文件內容如下 # 提示用戶確認繼續執行 read -p "確認要執行腳本嗎&#xff1f;(輸入 yes 繼續): " userInput# 檢查用戶輸入是否為 "yes" if [ "$userInput" ! "yes" ]; thenecho "用戶…

《TCP/IP詳解 卷一》第9章 廣播和組播

目錄 9.1 引言 9.2 廣播 9.2.1 使用廣播地址 9.2.2 發送廣播數據報 9.3 組播 9.3.1 將組播IP地址轉換為組播MAC地址 9.3.2 例子 9.3.3 發送組播數據報 9.3.4 接收組播數據報 9.3.5 主機地址過濾 9.4 IGMP協議和MLD協議 9.4.1 組成員的IGMP和MLD處理 9.4.2 組播路由…

可用于智能客服的完全開源免費商用的知識庫項目

介紹 FastWiki項目是一個高性能、基于最新技術棧的知識庫系統&#xff0c;專為大規模信息檢索和智能搜索設計。利用微軟Semantic Kernel進行深度學習和自然語言處理&#xff0c;結合.NET 8和MasaBlazor前端框架&#xff0c;后臺采用.NET 8MasaFrameworkSemanticKernel&#xff…

嵌入式Linux學習DAY26

管道的作用&#xff1a;進程間的通信 無名管道&#xff1a; 只能在父子進程中進行通信 pipe int pipe(int pipefd[2]); 功能: 創建一個無名管道 參數: pipefd[0]:讀管道文件描述符 pipefd[1]:寫管道文件描述符 …

【InternLM 實戰營筆記】基于 InternLM 和 LangChain 搭建MindSpore知識庫

InternLM 模型部署 準備環境 拷貝環境 /root/share/install_conda_env_internlm_base.sh InternLM激活環境 conda activate InternLM安裝依賴 # 升級pip python -m pip install --upgrade pippip install modelscope1.9.5 pip install transformers4.35.2 pip install str…

【大廠AI課學習筆記NO.53】2.3深度學習開發任務實例(6)數據采集

這個系列寫了53期了&#xff0c;很多朋友收藏&#xff0c;看來還是覺得有用。 后續我會把相關的內容&#xff0c;再次整理&#xff0c;做成一個人工智能專輯。 今天學習到了數據采集的環節。 這里有個問題&#xff0c;數據準備包括什么&#xff0c;還記得嗎&#xff1f; 數…

ZStack Cube超融合入選IDC《中國超融合基礎架構市場評估》報告

近日&#xff0c;IDC發布了《中國超融合基礎架構市場評估&#xff0c;2023》。IDC針對中國超融合基礎架構市場的發展現狀展開了調研&#xff0c;明確了最終用戶構建融合型云平臺的痛點和難點&#xff0c;闡述了市場中各技術服務提供商的服務方案和優勢&#xff0c;并對未來中國…

vue3+ts+vite數據大屏自適應總結(兩種方法)

總結一下我常用的數據大屏自適應方法 目錄 1、通過css縮放方案&#xff1a; 利用transform&#xff1a;scale 進行適配2、采用rem布局&#xff0c; 根據屏幕分辨率大小不同&#xff0c;調整根元素html的font-size&#xff0c; 從而達到每個元素寬高自動變化&#xff0c;適配不…