【Spring】SpringBoot日志

SpringBoot日志

  • 日志概述
  • 日志使用
  • 打印日志
    • 獲取日志對象
    • 使用日志對象打印日志
    • 日志框架介紹
      • 門面模式
      • SLF4J框架介紹(simple logging facade for java)
    • 日志格式說明
    • 日志級別
      • 日志級別的分類
      • 日志級別的使用
    • 日志配置
      • 配置日志級別
      • 日志持久化
        • 配置日志文件的路徑和文件名
        • 配置日志文件的保存路徑
      • 配置日志文件分割
  • 更簡單的日志輸出

日志概述

  1. 為什么要學習?志
    ?志對我們來說并不陌?, 從JavaSE部分, 我們就在使? System.out.print 來打印?志了. 通過打印?志來發現和定位問題, 或者根據?志來分析程序的運?過程.在Spring的學習中, 也經常根據控制臺的?志來分析和定位問題.

隨著項?的復雜度提升, 我們對?志的打印也有了更?的需求, ?不僅僅是定位排查問題.
?如需要記錄?些??的操作記錄(?些審計公司會要求), 也可能需要使??志來記錄??的?些喜好,把?志持久化, 后續進?數據分析等. 但是 System.out.print 不能很好的滿?我們的需求, 我們就需要使??些專??志框架(專業的事情交給專業的?去做)

日志使用

Spring Boot 項?在啟動的時候默認就有?志輸出,如下圖所?:
在這里插入圖片描述
我們可以看到SpringBoot答應出來的日志卻少了很多信息

SpringBoot打印出來的日志有 日志時間 日志級別 線程 打印日志的位置 日志信息等

springboot內置了日志框架slf4j,我們可以直接在程序中調用slf4j來輸出日志

打印日志

打印日志的步驟:

  • 在程序中得到日志對象
  • 使用日志對象輸出要打印的內容

獲取日志對象

在程序中獲取?志對象需要使??志?? LoggerFactory,如下代碼所?:

public class LogController {private static Logger logger = LoggerFactory.getLogger(LogController.class);
}

LoggerFactory.getLogger需要傳遞一個參數,標識這個日志的名稱,這樣可以更清晰的直到是哪個類輸出的日志,當有問題時,可以更方便直觀的定位到問題類

使用日志對象打印日志

日志對象的打印方法有很多種,我們可以先使用info()方法來輸出日志

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class LogController {private static Logger logger = LoggerFactory.getLogger(LogController.class);@RequestMapping("/log")public String logger(){logger.info("這是一段日志");return "打印日志";}
}

在這里插入圖片描述

日志框架介紹

在這里插入圖片描述

SLF4J不同于其他日志框架,他不是一個真正的日志實現,而是一個抽象層,對日志框架指定的一種規范,標準,接口,所有SLF4J并不能獨立使用,需要和具體的日志框架配合使用

門面模式

SLF4J是門面模式的典型應用

門面模式(Facade Pattern)是一種軟件設計模式,它提供了一個統一的接口,用來訪問子系統中的一群接口。這個模式通過創建一個高層接口,簡化了客戶端與子系統之間的交互,從而降低了系統之間的耦合度。

通常情況下,一個系統由多個子系統組成,每個子系統都有自己的接口和功能。而客戶端需要與這些子系統進行交互,這樣可能會導致客戶端代碼變得復雜,并且對系統的變化比較敏感。門面模式的出現正是為了解決這個問題。

通過門面模式,客戶端只需要和門面對象交互,而門面對象負責將請求委派給相應的子系統進行處理。這樣一來,客戶端就不需要了解子系統的具體實現細節,從而降低了客戶端和子系統之間的耦合度,同時也方便了對子系統的修改和維護。

總的來說,門面模式可以幫助簡化復雜系統的接口,提高系統的靈活性和可維護性,同時也能夠隱藏系統的復雜性,使客戶端更加容易使用。

在這里插入圖片描述
門面模式主要包含兩種角色

外觀角色,也成為門面角色,系統對外的統一接口
子系統角色,可以同時有一個或多個SubSystem,每個SubSystem都不是一個單獨的類,而是一個類的集合,SubSystem并不知道Facade的存在,

SLF4J框架介紹(simple logging facade for java)

SLF4J就是其他日志框架的門面,SLF4J可以理解為是提供日志服務的統一API接口,并不涉及到具體的日志邏輯實現

不引入日志門面

常見的日志框架有log4j ,logback等 如果一個項目已經使用log4j,而你依賴的另一個類庫,假如依賴另一個日志框架logback,那么就需要吧logback也加進去

存在問題

  1. 不同的日志框架的API接口和配置文件不同,如果多個日志框架并存,那么不得不維護多套配置文件(這里的配置文件指的是用戶自定義的配置文件)
  2. 如果要更換日志框架,應用程序將不得不修改代碼,并且修改過程中可能會存在一些代碼沖突
  3. 如果引入的第三方框架,使用了多套,那就不得不維護多套配置

引入日志門面

引入日志門面框架后,應用程序和日志框架之間有了統一 的API接口,此時應用程序只需要維護一套日志文件配置,且當底層實現框架改變時,也不需要更改應用程序代碼

日志格式說明

在這里插入圖片描述
從上圖可以看到,?志輸出內容元素具體如下:

  1. 時間?期:精確到毫秒
  2. ?志級別:ERROR, WARN, INFO, DEBUG 或TRACE
  3. 進程ID
  4. 線程名
  5. Logger名(通常使?源代碼的類名)
  6. ?志內容

日志級別

?志級別代表著?志信息對應問題的嚴重性, 為了更快的篩選符合?標的?志信息

日志級別的分類

在Spring框架中,日志級別通常遵循通用的日志級別標準,比如 SLF4J 或 Logback 中定義的日志級別。Spring框架本身并沒有定義自己的日志級別,而是使用這些通用的標準。以下是常見的日志級別:

TRACE:提供非常詳細的日志信息,通常用于調試,跟蹤程序執行過程中的細節。

DEBUG:用于輸出調試信息,用于輔助定位問題和調試程序。

INFO:提供一般性的運行時信息,表明應用程序正在運行。

WARN:表示潛在的問題,不會導致應用程序停止運行,但可能需要引起注意。

ERROR:用于指出雖然發生了錯誤,但仍然允許程序繼續運行。

FATAL:指出嚴重的錯誤,可能導致應用程序退出。

在配置Spring應用程序的日志級別時,可以通過配置文件(比如logback.xml或log4j2.xml)或者通過代碼來設置。一般來說,通過配置文件進行設置更為靈活,可以根據不同的包或類設置不同的日志級別。在Spring中,也可以通過Spring Boot的application.properties或application.yml文件來配置日志級別。

總的來說,通過合理設置日志級別,可以幫助開發人員了解應用程序的運行情況,快速定位問題,提高系統的可維護性和穩定性。

日志級別的使用

?志級別是開發?員??設置的. 開發?員根據??的理解來判斷該信息的重要程度

針對這些級別, Logger 對象分別提供了對應的?法, 來輸出?志

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class LogController {private static Logger logger = LoggerFactory.getLogger(LogController.class);@RequestMapping("/log")public String logger(){logger.trace("這是一段trace日志");logger.debug("這是一段debug日志");logger.info("這是一段info日志");logger.warn("這是一段warn日志");logger.error("這是一段error日志");return "打印日志";}
}

SpringBoot 默認的?志框架是Logback, Logback沒有 FATAL 級別, 它被映射到 ERROR .
出現fatal?志,表?服務已經出現了某種程度的不可?, 需要需要系統管理員緊急介?處理. 通常情況下, ?個進程?命周期中應該最多只有?次FATAL記錄.
在這里插入圖片描述
結果發現只打印了info,warn和error級別的日志

這與日志級別的配置有關,日志的輸出默認級別時info級別 ,所以只會打印大于等于此級別的日志,也就是info,warn和error

日志配置

上述是?志的使?, ?志框架?持我們更靈活的輸出?志, 包括內容, 格式等

配置日志級別

我們可以在配置文件application.yml中配置logging.level配置項即可
在這里插入圖片描述
在這里插入圖片描述
我們可以發現此時就可以打印出Debug級別的日志了

日志持久化

以上的?志都是輸出在控制臺上的, 然?在線上環境中, 我們需要把?志保存下來, 以便出現問題之后追溯問題. 把?志保存下來就叫持久化.

日志持久化的兩種方式

  1. 配置日志文件名
  2. 配置日志的存儲目錄
配置日志文件的路徑和文件名

yml配置文件配置
設置文件的文件名
在這里插入圖片描述

在這里插入圖片描述

配置日志文件的保存路徑

這種方式只能設置日志的路徑,文件名為固定的spring.log

在這里插入圖片描述
在這里插入圖片描述

注意:
logging.file.name 和 logging.file.path 兩個都配置的情況下, 只?效其?, 以logging.file.name 為準

配置日志文件分割

如果我們的?志都放在?個?件中, 隨著項?的運?, ?志?件會越來越?, 需要對?志?件進?分割

當然, ?志框架也幫我們考慮到了這?點, 所以如果不進?配置, 就??動配置
默認?志?件超過10M就進?分割

配置項說明默認值
logging.logback.rollingpolicy.file-name-pattern?志分割后的?件名格式${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
logging.logback.rollingpolicy.max-file-size?志?件超過這個??就?動分割10MB

配置文件分割

yml配置

logging:logback:rollingpolicy:max-file-size: 1KBfile-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
  1. ?志?件超過1KB就分割(設置1KB是為了更好展?. 企業開發通常設置為200M, 500M等, 此處沒
    有明確標準)
  2. 分割后的?志?件名為: ?志名.?期.索引

在這里插入圖片描述

更簡單的日志輸出

每次都使? LoggerFactory.getLogger(xxx.class) 很繁瑣, 且每個類都添加?遍, lombok給我們提供了?種更簡單的?式.

  1. 添加 lombok 框架?持
  2. 使? @slf4j 注解輸出?志。
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@Slf4j
@RestController
public class LogController {
//    private static Logger logger = LoggerFactory.getLogger(LogController.class);@RequestMapping("/log")public String logger(){//此時對象名稱為固定的loglog.trace("這是一段trace日志");log.debug("這是一段debug日志");log.info("這是一段info日志");log.warn("這是一段warn日志");log.error("這是一段error日志");return "打印日志";}
}

在這里插入圖片描述
我們可以發現 這個注解的生命周期只存在于源代碼階段
在這里插入圖片描述
**代碼在經過編譯之后 自動為我們生成了Logger對象 **

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

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

相關文章

【刷題篇】動態規劃(六)

文章目錄 1、最大子數組和2、環形子數組的最大和3、乘積最大子數組4、乘積為正數的最長子數組長度5、 等差數列劃分6、最長湍流子數組 1、最大子數組和 給你一個整數數組 nums ,請你找出一個具有最大和的連續子數組(子數組最少包含一個元素)&…

【Unity動畫】Avatar Mask

創建 Avatar Mask可以設置那一部分骨骼運動和不運動 然后放在狀態機里面的層中來混合 【后續完善】

深入探索 Rust 宏編程

Rust 宏提供了一種強大的方法來編寫抽象和重用代碼,它們在 Rust 編程中扮演著重要的角色。本文將深入探索 Rust 宏的概念、類型、使用方法以及如何實現自定義宏,以提供一個全面的 Rust 宏編程指南。 Rust 宏簡介 宏是 Rust 中的一種元編程工具,它們在編譯時運行,用于生成…

linux安裝node

文章目錄 安裝node 安裝node 一次手操記錄 - 首先安裝wget yum install -y wget - 下載nodejs最新的tar包 wget https://cdn.npm.taobao.org/dist/node/v12.12.0/node-v12.12.0-linux-x64.tar.xz - 解壓包 tar -xvf node-v12.12.0-linux-x64.tar.xz - 部署bin文件 先確認你no…

30 張圖解 HTTP 常見的面試題

前言 在面試過程中,HTTP 被提問的概率還是比較高的 我搜集了 5 大類 HTTP 面試常問的題目,同時這 5 大類題跟 HTTP 的發展和演變關聯性是比較大的,通過問答 圖解的形式由淺入深的方式幫助大家進一步的學習和理解 HTTP 協議。 HTTP 基本概…

第四節JavaScript 條件語句、循環語句、break與continue語句

一、JavaScript條件語句 在通常的代碼中,我們有一些需要決定執行不同動作,這就可以在代碼中使用條件語句來完成。 下面是我們常使用的條件語句: if語句:只有當指定條件是true時,執行條件內代碼。if…else語句&#…

JavaScript數組的長度

JavaScript數組的長度可以通過數組對象的length屬性來獲取,長度表示數組中元素的數量。 代碼示例: let arr []; // 定義一個空數組 console.log(arr.length); // 輸出 0arr.push(1); // 給數組添加元素 arr.push(2); arr.push(3); console.log(arr.le…

項目二 創建與操作學生管理數據庫

項目二 創建與操作學生管理數據庫 #目標 創建庫;查看庫;操作庫;圖形工具操作庫1,創建學生管理數據庫 #創建數據庫 CREATE DATABASE [IF NOT EXISTS] db_name [[DEFAULT] CHARACTER SET charset_name] [[DEFAULT] COLLATE collat…

44.0/認識前端

44.1 目錄 44.1.1 網頁 44.1.1.1 網頁的組成 44.1.1.2 網頁的分類 44.1.2 網站 44.1.2.1 網站的分類 44.1.3 主頁 44.2. Internet、IP 地址和域名 44.2.1 Internet 44.2.2 IP 44.2.3 域名 44.3. Web 前端技術概述 44.3.1 html5 44.3.2 CSS3 44.3.3 Javascript …

hbuiler中使用npm安裝datav

注:datav邊框樣式目前使用時:適用于網頁,不適用于app 1、先安裝node 安裝、配置Node路徑 2、為Node配置環境變量 3、在hbuilder的設置中填寫node的路徑 配置 4、打開cmd輸入npm install jiaminghi/data-view 安裝dataV,&…

當初為什么選擇計算機-希望一直干下去

還記得當初自己為什么選擇計算機? 當初你問我為什么選擇計算機,我笑著回答:“因為我夢想成為神奇的碼農!我想像編織魔法一樣編寫程序,創造出炫酷的虛擬世界!”誰知道,我剛入門的那天&#xff0…

.360勒索病毒數據恢復|金蝶、用友、管家婆、OA、速達、ERP等軟件數據庫恢復

尊敬的讀者: 在數字時代,.360勒索病毒如同數字的幽靈,悄無聲息地侵入用戶的數字領域,將珍貴的數據文件變為數字的囚牢。本文將介紹.360勒索病毒的特征,提供解密和數據恢復的方法,并分享有效的預防措施&…

【PID學習筆記 9 】控制系統的分析方法之二

寫在前面 前文重點介紹時域分析法、本文將繼續學習控制系統的另外幾種分析方法,包括根軌跡法、頻率分析法、狀態空間分析法。再次強調,在這里只是做了一個系統化的概述,目的是讓學習PID,特別是用PID的工程人員有一個對基礎知識的…

【開源】基于JAVA語言的數字化社區網格管理系統

項目編號: S 042 ,文末獲取源碼。 \color{red}{項目編號:S042,文末獲取源碼。} 項目編號:S042,文末獲取源碼。 目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊三、開發背景四、系統展示五、核心源碼5…

SELinux零知識學習三十八、SELinux策略語言之約束(2)

接前一篇文章:SELinux零知識學習三十七、SELinux策略語言之約束(1) 四、SELinux策略語言之約束 SELinux對策略允許的訪問提供了更嚴格的約束機制,不管策略的allow規則如何。 SELinux有兩種類型的約束: constrain語句constrain語句是最常見的約束,使得可以基于用戶、角色…

3.DevEco Studio安裝鴻蒙手機app本地模擬器

配合Intel CPU啟動模擬器 解決措施 打開任務管理器,在“性能”選項,檢查CPU虛擬化是否已經啟用。如果未啟用,需要進入電腦的BIOS中,將CPU的“Intel Virtualization Technology”選項開啟。 點擊New Emulator 文檔中心 解決措施…

鐵路通信鐵塔監測方案

目錄 1.監測的背景及意義 1.1監測背景 1.2監測意義 2.系統介紹及特點 2.1系統介紹 2.2系統特點 3.系統設計 3.1監測內容 3.2總體介紹 3.3詳細設計 3.3.1垂直度監測 3.3.2水平位移、沉降監測 3.3.3環境監測 3.3.4應力應變監測 3.3.5裂縫監測 3.3.6云平臺綜合在線…

VBA技術資料MF93:將多個Excel表插入PowerPoint不同位置

我給VBA的定義:VBA是個人小型自動化處理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高數據的準確度。我的教程一共九套,分為初級、中級、高級三大部分。是對VBA的系統講解,從簡單的入門,到…

TypeScript 之 console的使用

語言: TypeScript 在線工具: PlayGround console console 對象是一個非常強大的控制臺日志顯示工具, 可以幫助我們在瀏覽器中調試代碼。 注: console不屬于TypeScript的語法,而是由JavaScript封裝的內置對象。 簡單的…

C語言精選——選擇題Day42

第一題 1. 下面程序輸出的結果是&#xff08;&#xff09; #include <stdio.h> int main () {int x;x printf("I See, Sea in C");printf("x%d" , x); } A&#xff1a;2 B&#xff1a;隨機值 C&#xff1a;都不是 D&#xff1a;15 答案及解析 D p…