Hutool - Log:自動識別日志實現的日志門面

一、簡介

在 Java 開發中,日志記錄是一項非常重要的功能,它可以幫助開發者在開發和生產環境中監控程序的運行狀態、排查問題。然而,Java 生態系統中有多種日志實現框架,如 Log4j、Logback、JDK 自帶的日志框架等。為了在不同的項目中靈活切換日志實現,同時避免代碼與具體的日志框架耦合,日志門面(Logging Facade)應運而生。Hutool - Log 就是一個自動識別日志實現的日志門面,它提供了統一的日志記錄接口,能夠自動檢測項目中使用的日志實現框架,并將日志記錄操作委托給相應的實現。

二、引入依賴

如果你使用 Maven 項目,在 pom.xml 中添加以下依賴:

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version>
</dependency>

若使用 Gradle 項目,在 build.gradle 中添加:

implementation 'cn.hutool:hutool-all:5.8.16'
三、自動識別日志實現原理

Hutool - Log 在運行時會按照一定的順序檢測項目中是否存在常見的日志實現框架,檢測順序如下:

  1. Logback
  2. Log4j 2
  3. Log4j
  4. JDK Logging

當檢測到某個日志實現框架存在時,Hutool - Log 會自動使用該框架進行日志記錄。如果沒有檢測到任何日志實現框架,Hutool - Log 會默認使用 JDK 自帶的日志框架。

四、基本使用示例
1. 獲取日志對象
import cn.hutool.log.StaticLog;public class LogExample {public static void main(String[] args) {// 獲取日志對象cn.hutool.log.Log log = StaticLog.get();// 記錄不同級別的日志log.trace("這是一條 trace 級別的日志");log.debug("這是一條 debug 級別的日志");log.info("這是一條 info 級別的日志");log.warn("這是一條 warn 級別的日志");log.error("這是一條 error 級別的日志");}
}

在上述代碼中,使用 StaticLog.get() 方法獲取日志對象。StaticLog 是 Hutool - Log 提供的一個靜態工具類,方便在代碼中獲取日志對象。然后,使用日志對象的不同方法記錄不同級別的日志,如 tracedebuginfowarnerror

2. 指定類名獲取日志對象
import cn.hutool.log.StaticLog;public class LogWithClassNameExample {public static void main(String[] args) {// 指定類名獲取日志對象cn.hutool.log.Log log = StaticLog.get(LogWithClassNameExample.class);log.info("使用指定類名獲取的日志對象記錄信息");}
}

通過 StaticLog.get(Class<?> clazz) 方法可以指定類名獲取日志對象,這樣在日志記錄中可以清晰地看到日志所屬的類。

五、日志級別控制

不同的日志實現框架都支持日志級別的控制,通過配置文件可以設置不同級別的日志是否輸出。以下是幾種常見日志實現框架的配置示例:

1. Logback 配置

src/main/resources 目錄下創建 logback.xml 文件,內容如下:

<configuration><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><root level="info"><appender-ref ref="STDOUT" /></root>
</configuration>

在這個配置中,將根日志級別設置為 info,表示只輸出 info 及以上級別的日志。

2. Log4j 2 配置

src/main/resources 目錄下創建 log4j2.xml 文件,內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/></Console></Appenders><Loggers><Root level="info"><AppenderRef ref="Console"/></Root></Loggers>
</Configuration>

同樣,將根日志級別設置為 info,只輸出 info 及以上級別的日志。

六、異常日志記錄

在程序中捕獲異常并記錄異常信息是很常見的操作,Hutool - Log 提供了方便的方法來記錄異常日志。

import cn.hutool.log.StaticLog;public class ExceptionLogExample {public static void main(String[] args) {cn.hutool.log.Log log = StaticLog.get();try {int result = 1 / 0;} catch (ArithmeticException e) {log.error("發生算術異常", e);}}
}

在上述代碼中,捕獲 ArithmeticException 異常,并使用 log.error 方法記錄異常信息,第二個參數傳入異常對象,這樣可以在日志中看到詳細的異常堆棧信息。

七、注意事項
  • 日志框架依賴:要確保項目中引入了相應的日志實現框架依賴,否則 Hutool - Log 會默認使用 JDK 自帶的日志框架。例如,如果要使用 Logback,需要在 pom.xml 中添加以下依賴:
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.11</version>
</dependency>
  • 配置文件位置:不同的日志實現框架的配置文件位置和格式可能不同,要確保配置文件正確放置在 src/main/resources 目錄下,并且格式正確,才能生效。
  • 性能考慮:日志記錄會對程序的性能產生一定的影響,尤其是在高并發場景下。因此,要合理設置日志級別,避免記錄過多不必要的日志信息。

通過使用 Hutool - Log,開發者可以在不關心具體日志實現框架的情況下,方便地進行日志記錄,提高開發效率,同時保持代碼的靈活性和可維護性。

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

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

相關文章

偽404兼容huawei生效顯示404

根據上述思考&#xff0c;以下是詳細的中文分步說明&#xff1a; --- **步驟 1&#xff1a;獲取目標設備的User-Agent信息** 首先&#xff0c;我們需要收集目標設備的User-Agent字符串&#xff0c;包括&#xff1a; 1. **iPhone設備的User-Agent**&#xff1a; Mozi…

github配置sshkey

使用命令生成sshkey ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 依此會要求輸入以下信息&#xff0c;可以使用默認值 設置保存密鑰的路徑 設置SSH密鑰密碼&#xff08;備注&#xff1a;空內容表示不設置SSH密鑰密碼&#xff09; 再次確認SSH密鑰密…

深入理解WebSocket接口:如何使用C++實現行情接口

在現代網絡應用中&#xff0c;實時數據傳輸變得越來越重要。通過WebSocket&#xff0c;我們可以建立一個持久連接&#xff0c;讓服務器和客戶端之間進行雙向通信。這種技術不僅可以提供更快的響應速度&#xff0c;還可以減少不必要的網絡流量。本文將詳細介紹如何使用C來實現We…

FFMPEG編碼容錯處理解決辦法之途徑----升級庫文件

在qt開發環境下接收網絡數據&#xff0c;調用ffmpeg解碼播放視頻&#xff0c;出現閃屏現象&#xff0c;具體現象可以使用操作系統自帶的ffplay播放器播放原始視頻流可復現&#xff1b;而使用操作系統自帶的mpv播放器播放視頻則不會出現閃屏&#xff1b;閃屏時會報Could not fin…

什么是超越編程(逾編程)(元編程?)

超越編程(逾編程)(元編程&#xff1f;)(meta-programming) 目錄 1. meta- 的詞源 2. 逾編程(meta-programming) 的直實含義 2.1 定義 2.2 說明 3. 翻譯成“元編程”應該是一種錯誤 1. meta- 的詞源 這是一個源自希臘語的構詞元素&#xff0c;其有三種含義&#xff…

基于Martin的全國基礎底圖實現

概述 前面有文章基于Martin實現MapboxGL自定義底圖分享了Martin的使用&#xff0c;本文使用網絡收集的數據實現了全國基礎數據的收集和基礎底圖。 實現后效果 實現 1. 數據準備 實例中包含如下數據&#xff1a; 邊界線和九段線數據省邊界面數據省會城市點數據市邊界面數據…

新版Tomcat MySQL IDEA 安裝配置過程遇到的問題

一、IDEA閃退 打不開了 IDEA環境變量路徑不對 二、Tomcat 一閃而過 主要是JDK環境變量不對 三、MySQL 重新安裝、是否備份以及默認盤問題 看清楚教程基本沒問題&#xff1a;Windows 安裝配置及卸載MySQL8超詳細保姆級教程_mysql8卸載-CSDN博客

鏈表_兩兩交換鏈表中的節點

鏈表_兩兩交換鏈表中的節點 一、leetcode-24二、題解1.引庫2.代碼 一、leetcode-24 兩兩交換鏈表中的節點 給你一個鏈表&#xff0c;兩兩交換其中相鄰的節點&#xff0c;并返回交換后鏈表的頭節點。你必須在不修改節點內部的值的情況下完成本題&#xff08;即&#xff0c;只能…

DAY08 List接口、Collections接口、Set接口

學習目標 能夠說出List集合特點1.有序2.允許存儲重復的元素3.有帶索引的方法(練習 add,remove,set,get) 能夠使用集合工具類Collections類:static void sort(List<T> list) 根據元素的自然順序 對指定列表按升序進行排序。static <T> void sort(List<T> lis…

Zookeeper(58)如何在Zookeeper中實現分布式鎖?

在 Zookeeper 中實現分布式鎖是一種常見的用例。Zookeeper 提供了強一致性、高可用性的分布式協調服務&#xff0c;使得它非常適合用來實現分布式鎖。以下是詳細的步驟和代碼示例&#xff0c;展示如何在 Zookeeper 中實現分布式鎖。 1. Zookeeper 分布式鎖的基本原理 Zookeep…

帆軟報表FineReport入門:簡單報表制作[擴展|左父格|上父格]

FineReport幫助文檔 - 全面的報表使用教程和學習資料 數據庫連接 點擊號>>JDBC 選擇要連接的數據庫>>填寫信息>>點擊測試連接 數據庫SQLite是帆軟的內置數據庫, 里面有練習數據 選擇此數據庫后,點擊測試連接即可 數據庫查詢 方法一: 在左下角的模板數據集…

后臺管理系統-項目初始化

認識vue-admin **核心交付:** 為什么要基于現成架子二次開發 什么是二次開發:基于已有的代碼(項目工程,腳手架)開進行新功能的開發 所以看懂已有的框架中的既有代碼,變得很重要了 1. 背景知識 后臺管理系統是一種最常見的應用模式,不同的管理系統之間有很多相似的地方…

DAY07 Collection、Iterator、泛型、數據結構

學習目標 能夠說出集合與數組的區別數組:1.是引用數據類型的一種2.可以存儲多個元素3.數組的長度是固定的 int[] arr1 new int[10]; int[] arr2 {1,2,3};4.數組即可以存儲基本類型的數據,又可以存儲引用數據類型的數據int[],double[],String[],Student[]集合:1.是引用數據類…

VLM(視覺語言模型)與DeepSeek R1(獎勵機制)如何結合

VLM&#xff08;視覺語言模型&#xff09;與DeepSeek R1&#xff08;獎勵機制&#xff09;如何結合 flyfish VLM的傳統訓練依賴于監督學習&#xff08;直接擬合問答對&#xff09;&#xff0c;而規則獎勵函數通常用于強化學習&#xff08;通過試錯和獎勵反饋優化策略&#xf…

從零開始構建一個語言模型中vocab_size(詞匯表大小)的設定規則

從零開始構建一個語言模型就要設計一個模型框架,其中要配置很多參數。在自然語言處理任務中,vocab_size(詞匯表大小) 的設定是模型設計的關鍵參數之一,它直接影響模型的輸入輸出結構、計算效率和內存消耗。 本文是在我前文的基礎上講解的:從零開始構建一個小型字符級語言…

計算機網絡之物理層——基于《計算機網絡》謝希仁第八版

(??? )&#xff0c;Hello我是祐言QAQ我的博客主頁&#xff1a;C/C語言&#xff0c;數據結構&#xff0c;Linux基礎&#xff0c;ARM開發板&#xff0c;網絡編程等領域UP&#x1f30d;快上&#x1f698;&#xff0c;一起學習&#xff0c;讓我們成為一個強大的攻城獅&#xff0…

實時股票行情接口與WebSocket行情接口的應用

實時股票行情接口與WebSocket行情接口的應用 實時股票行情接口是量化交易和投資決策的核心工具之一&#xff0c;行情接口的種類和功能也在不斷擴展。介紹幾種常見的行情接口&#xff0c;包括實時股票行情接口、Level2行情接口、WebSocket行情接口以及量化行情接口&#xff0c;…

圖論 之 BFS

文章目錄 3243.新增道路查詢后的最短距離1311.獲取你好友已觀看的視頻 BFS:廣度優先搜索&#xff08;BFS&#xff09; 是一種常用的算法&#xff0c;通常用于解決圖或樹的遍歷問題&#xff0c;尤其是尋找最短路徑或層級遍歷的場景。BFS 的核心思想是使用隊列&#xff08;FIFO 數…

ollama stream“:True django如何返回數據

在使用 Django 框架開發 Web 應用時&#xff0c;如果你想要通過 Ollama 流式返回數據&#xff0c;你可以通過 Django 的 HttpResponse 或者 StreamingHttpResponse 來實現。Ollama 主要用于處理文本生成任務&#xff0c;如聊天機器人、自動完成等&#xff0c;通常這些任務會產生…

為什么要用 const 和 let,而不是 var?

JavaScript 中有三種方式聲明變量&#xff1a;var、let 和 const。其中&#xff0c;var 是早期版本的 JavaScript 中的標準&#xff0c;但隨著 ECMAScript 6&#xff08;ES6&#xff09;引入了 let 和 const&#xff0c;var 的種種問題也顯現出來。今天&#xff0c;我們將探討為…