Spring Boot 項目三種打印日志的方法詳解。Logger,log,logger 解讀。

目錄

一. 打印日志的常見三種方法?

1.1?手動創建 Logger 對象(基于SLF4J API)

1.2?使用 Lombok 插件的 @Slf4j 注解

1.3?使用 Spring 的 Log?接口(使用頻率較低)

二. 常見的 Logger,logger,log是有什么關系嗎?

三. 日志的級別和推薦級別


一. 打印日志的常見三種方法?

1.1?手動創建 Logger 對象(基于SLF4J API)

第一種方法就是手動創建 logger 日志對象,直接通過?LoggerFactory 日志工廠創建即可,使用 Logger 類型來接收,這里實例對象就叫 "logger"。

SLF4J 是日志門面(Facade),它提供統一的日志接口,不直接實現日志功能。

核心類org.slf4j.Logger?是 SLF4J 的核心接口,通過?LoggerFactory.getLogger()?創建實例。

打印日志也可以單個或多個參數,具體實例如下圖,

注意每個"{}"對應一個參數即可,并且參數順序要對的上。

import com.markerhub.entity.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.time.LocalDateTime;public class MyClass {// 通過?LoggerFactory 日志工廠創建日志對象private static final Logger logger = LoggerFactory.getLogger(MyClass.class);public static void main(String[] args) {// 用法一:單個參數 logger 日志打印String message = "abcde";logger.info("這是手動創建的 logger 對象打出的日志:打印單個參數{}", message);// 用法二:多個參數 logger 日志打印int number = 100;String message2 = "abcdefg";long time = 1000000000000000000L;logger.info("這是手動創建的 logger 對象打出的日志:打印多個參數{},{},{}", number, message2, time);// 用法三:對象參數 logger 日志打印User user1 = new User();user1.setUsername("zhangsna");user1.setPassword("123456");user1.setCreated(LocalDateTime.now());user1.setEmail("123456@qq.com");user1.setStatus(1);logger.info("這是手動創建的 logger 對象打出的日志:打印對象參數{}", user1);logger.debug("debug 日志");logger.error("error 日志");}
}

運行程序,如下控制臺打印所示,可以看出 info 就是普通的日志,debug 是調試日志,error 是錯誤日志。

這里之所以有顏色區分是因為小編使用了插件,插件名稱:"Grep Console",有需要的小伙伴可以搜索看下使用教程。

1.2?使用 Lombok 插件的 @Slf4j 注解

第二種方法最簡單,直接使用 @Slf4j 注解,但需要注意IDEA中需要安裝了 Lombok 插件并且你的 spring boot 項目中引用了 lombok 依賴。

@Slf4j 是lombok插件提供的一個注解,用于自動生成 SLF4J 的?Logger?實例,減少樣板代碼。其底層還是通過第一種方式去新建的 logger 對象。

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>

如下代碼

注解在類的頭上添加 @Slf4j 注解即可,然后就可以在本類的任意位置直接顯式調用 log 對象,不需要再自行創建,非常方便。

import com.markerhub.entity.User;
import lombok.extern.slf4j.Slf4j;import java.time.LocalDateTime;@Slf4j
public class MyClass {public static void main(String[] args) {// 用法一:單個參數 logger 日志打印String message = "abcde";log.info("這是 @Slf4j 注解的 log 對象打出的日志:打印單個參數{}", message);// 用法二:多個參數 logger 日志打印int number = 100;String message2 = "abcdefg";long time = 1000000000000000000L;log.info("這是 @Slf4j 注解的 log 對象打出的日志:打印多個參數{},{},{}", number, message2, time);// 用法三:對象參數 logger 日志打印User user1 = new User();user1.setUsername("zhangsna");user1.setPassword("123456");user1.setCreated(LocalDateTime.now());user1.setEmail("123456@qq.com");user1.setStatus(1);log.info("這是 @Slf4j 注解的 log 對象打出的日志:打印對象參數{}", user1);log.debug("debug 日志");log.error("error 日志");}
}

運行程序,如下圖,和上面的 logger 對象效果是完全一樣的。?

1.3?使用 Spring 的 Log?接口(使用頻率較低)

如下代碼所示,Spring 自身提供了?Log接口也可以創建日志對象。

import com.markerhub.entity.User;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.time.LocalDateTime;public class MyClass {private static final Log logger = LogFactory.getLog(MyClass.class);public static void main(String[] args) {// 用法一:單個參數 logger 日志打印String message = "abcde";logger.info("這是 @Slf4j 注解的 log 對象打出的日志:打印單個參數{}",message);// 用法二:多個參數 logger 日志打印int number = 100;String message2 = "abcdefg";long time = 1000000000000000000L;logger.info("這是 @Slf4j 注解的 log 對象打出的日志:打印多個參數{},{},{}", number, message2, time);// 用法三:對象參數 logger 日志打印User user1 = new User();user1.setUsername("zhangsna");user1.setPassword("123456");user1.setCreated(LocalDateTime.now());user1.setEmail("123456@qq.com");user1.setStatus(1);logger.info("這是 @Slf4j 注解的 log 對象打出的日志:打印對象參數{}", user1);logger.debug("debug 日志");logger.error("error 日志");}
}

但是, Spring 提供的 logger 對象,無法像前兩種一樣輸出參數值,這一點其實是不太友好的,不過 Spring 提供的這種日志輸出方式基本也沒人使用,同學們作為了解即可,主要還是前兩種用的比較多。

二. 常見的 Logger,logger,log是有什么關系嗎?

(1)Logger 是SLF4J提供的日志接口,用于創建日志對象(如?LoggerFactory.getLogger())。需要手動實例化。

(2)log 是通過?@Slf4j?注解生成的變量名,本質還是一個?Logger?實例。

(3)logger ,沒有特殊含義,只是采用SLF4J提供的日志接口創建對象時,常常見對象命名為 logger 而已。

三. 日志的級別和推薦級別

如以下表格所示,日志的詳細程度由高到低。一般情況下,日志輸出的詳細,越耗費系統性能,所以不建議將日志輸出特別詳細,適中即可,大部分都是選擇 INFO 級別,也推薦大家盡量選擇 INFO 或 DEBUG

級別嚴重性適用場景生產環境建議開發環境建議
TRACE最低詳細追蹤程序執行流程關閉按需開啟
DEBUG調試代碼邏輯和變量狀態關閉開啟
INFO監控應用運行狀態和關鍵操作開啟開啟
WARN較高潛在問題,不影響程序運行開啟開啟
ERROR功能錯誤,需人工干預開啟開啟
FATAL最高致命錯誤,程序無法繼續運行開啟開啟

日志級別的設置,基本在配置文件中設置的,方式如下?

# 設置全局日志級別
logging.level.root=info# 設置特定包的日志級別
logging.level.com.example.myapp=debug# 自定義日志輸出格式和文件路徑
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
logging.file.name=app.log

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

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

相關文章

NI的LABVIEW工具安裝及卸載步驟說明

一.介紹 最近接到個轉交的項目&#xff0c;項目主要作為上位機工具開發&#xff0c;在對接下位機時&#xff0c;有用到NI的labview工具。labview軟件是由美國國家儀器&#xff08;NI&#xff09;公司研制開發的一種程序開發環境&#xff0c;主要用于汽車測試、數據采集、芯片測…

cmd 終端輸出亂碼問題 |Visual Studio 控制臺輸出中文亂碼解決

在網上下載&#xff0c;或者移植別人的代碼到自己的電腦&#xff0c;使用VS運行后&#xff0c;控制臺輸出中文可能出現亂碼。這是因為源代碼的編碼格式和控制臺的編碼格式不一致。 文章目錄 查看源代碼文件編碼格式查看輸出控制臺編碼格式修改編碼格式修改終端代碼頁 補充總結 …

A009-基于pytest的網易云自動化測試

題 目 :基于pytest的網易云自動化測試 主要內容 綜合應用所學的軟件測試理論和方法,實現網易云的功能自動化測試。 (1)自動化測試介紹; (2)自動化功能測試框架介紹; (3)設計功能測試用例 (4)書寫自動化測試腳本; (5)測試評價與結論。 任務要求 (1)能…

LVGL Video控件和Radiobtn控件詳解

LVGL Video控件和Radiobtn控件詳解 一、 Video控件詳解1. 概述2. 創建和初始化3. 基本屬性設置4. 視頻控制5. 回調函數6. 高級功能7. 注意事項 二、Radiobtn控件詳解1. 概述2. 創建和初始化3. 屬性設置4. 狀態控制5. 組管理6. 事件處理7. 樣式設置8. 注意事項 三、效果展示四、…

AbortController:讓異步操作隨時說停就停

AbortController&#xff1a;讓異步操作隨時說停就停 一、什么是 AbortController&#xff1f; AbortController 是 JavaScript 在瀏覽器和部分 Node.js 環境中提供的全局類&#xff0c;用來中止正在進行或待完成的異步操作&#xff08;如 fetch() 請求、事件監聽、可寫流、數…

機器學習 從入門到精通 day_04

1. 決策樹-分類 1.1 概念 1. 決策節點 通過條件判斷而進行分支選擇的節點。如&#xff1a;將某個樣本中的屬性值(特征值)與決策節點上的值進行比較&#xff0c;從而判斷它的流向。 2. 葉子節點 沒有子節點的節點&#xff0c;表示最終的決策結果。 3. 決策樹的…

C++ Primer (第五版)-第十三章 拷貝控制

文章目錄 概述13.1拷貝、賦值與銷毀合成拷貝構造函數拷貝初始化參數和返回值拷貝初始化的限制編譯器可以繞過拷貝構造函數拷貝運算符析構函數三/五原則使用default阻止拷貝合成的拷貝控制成員可能是刪除的 private拷貝控制拷貝控制和資源管理行為像值的類類值拷貝賦值運算符定義…

Vue el-from的el-form-item v-for循環表單如何校驗rules(一)

實際業務需求場景&#xff1a; 新增或編輯頁面&#xff08;基礎信息表單&#xff0c;一個數據列表的表單&#xff09;&#xff0c;數據列表里面的表單數是動態添加的。數據可新增、可刪除&#xff0c;在表單保存前&#xff0c;常常需要做表單必填項的校驗&#xff0c;校驗通過以…

測試100問:http和https的區別是什么?

哈嘍&#xff0c;大家好&#xff0c;我是十二&#xff0c;今天給大家分享的問題是&#xff1a;http和https的區別是什么&#xff1f; 首先我們要知道 HTTP 協議傳播的數據都是未加密的&#xff0c;也就是明文的&#xff0c;因此呢使用 http協議傳輸一些隱私信息也就非常不安全&…

YOLOv3超詳細解讀(三):源碼解析:數據處理模塊

一、概述 YOLOv3&#xff08;You Only Look Once v3&#xff09;是一種高效的目標檢測算法&#xff0c;其數據處理模塊是訓練和推理流程的核心部分。本文將深入分析Ultralytics團隊基于PyTorch實現的YOLOv3源碼中的數據處理模塊&#xff0c;重點探討數據加載、預處理和數據增強…

每日算法(雙指針算法)(Day 1)

雙指針算法 1.算法題目&#xff08;移動零&#xff09;2.講解算法原理3.編寫代碼 1.算法題目&#xff08;移動零&#xff09; 2.講解算法原理 數組劃分&#xff0c;數組分塊&#xff08;快排里面最核心的一步&#xff09;只需把0改為tmp 雙指針算法&#xff1a;利用數組下標來…

2025藍橋杯python A組省賽 題解

真捐款去了&#xff0c;好長時間沒練了&#xff0c;感覺腦子和手都不轉悠了。 B F BF BF 賽時都寫假了&#xff0c; G G G 也只寫了爆搜。 題解其實隊友都寫好了&#xff0c;我就粘一下自己的代碼&#xff0c;稍微提點個人的理解水一篇題解 隊友題解 2025藍橋杯C A組省賽 題…

測試基礎筆記第四天(html)

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 html介紹1. 介紹2.骨架標簽3.常用標簽標題標簽段落標簽超鏈接標簽圖片標簽換行和空格標簽布局標簽input標簽&#xff08;變形金剛&#xff09;form標簽列表標簽 htm…

10 穴 汽車連接器的15個設計特點

汽車行業嚴重依賴卓越的電氣系統來確保功能和可靠性。這些系統的關鍵組件是 10 腔連接器&#xff0c;它為布線和信號傳輸提供解決方案。制造商和工程師必須仔細評估這些連接器的設計特性&#xff0c;以優化性能和安全性。 本博客研究了汽車 10 腔連接器的 15 個設計特征&#…

Summary

一、數據結構 1.1 哈希 主要是HashMap和HashSet&#xff1b;其中HashSet底層是一個HashMap屬性。 // 獲取HashMap元素,HashSet均不支持 map.keySet (); // Set<k> map.values (; // Collection<V> map.entrySet();//Set<Map.Entry<K,V>> for (Map.E…

【Leetcode-Hot100】最小覆蓋子串

題目 解答 想到使用雙指針哈希表來實現&#xff0c;雙指針的left和right控制實現可滿足字符串。 class Solution(object):def minWindow(self, s, t):""":type s: str:type t: str:rtype: str"""len_s, len_t len(s), len(t)hash_map {}for…

Flutter 播放利器:`media_kit` 的詳細介紹與使用指南

在 Flutter 項目中實現音視頻播放&#xff0c;開發者過去主要依賴如 video_player、just_audio 等第三方庫&#xff0c;但這些庫或多或少存在一些局限性&#xff0c;比如平臺兼容性差、定制能力不足、播放格式有限等問題。 而 media_kit 是近年崛起的一款全平臺音視頻播放解決…

4.14【Q】pc homework3

我正在學習并行計算&#xff0c;解決這個問題&#xff1f;詳細解釋&#xff0c;越細節越好 我正在學習并行計算&#xff0c;“首次允許在 taskloop 構造中使用 reduction 子句&#xff0c;并引入了 task_reduction&#xff08;用于 taskgroup 構造&#xff09;和 in_reduction&…

ArrayList vs LinkedList,HashMap vs TreeMap:如何選擇最適合的集合類?

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 在 Java 開發中&#xff0c;集合類的選擇直接影響程序的性能和代碼的可維護性。不同的數據結構適用于不同的場景&#xff0c;盲目使用可能導致內存浪費、性能…

大模型訓練顯存壓縮實戰:ZeRO-3 vs 梯度累積 vs 量化混合策略

一、顯存瓶頸的本質與挑戰 大模型訓練面臨的核心矛盾是模型參數量指數級增長與GPU顯存容量線性提升之間的鴻溝。以175B參數模型為例&#xff0c;其顯存消耗主要來自三個方面&#xff1a; 參數存儲?&#xff1a;FP32精度下需700GB顯存?梯度緩存?&#xff1a;反向傳播產生的…