golang 日志log與logrus

目錄

一、Go 標準庫?log?詳解

1. 功能特點

2. 常用函數

3. 示例代碼

4. 優勢和局限

二、第三方庫?logrus?詳解

1. 功能特點

2. 核心功能

3. 示例代碼

4. 優勢和擴展性

三、總結

1. 何時選擇?log?

2. 何時選擇?logrus?

3. 對比總結


一、Go 標準庫?log?詳解

1. 功能特點

log?是 Go 語言標準庫中一個簡單的日志庫,主要功能包括:

  • 寫入日志到指定位置(默認為標準錯誤)
  • 支持_FATAL 和 _ERROR 等級別的日志
  • 支持格式化日志輸出
2. 常用函數

log?包中常用的函數如下:

函數名功能
log.Print輸出日志
log.Printf格式化輸出日志
log.Println輸出日志,自動換行
log.Fatal輸出日志并調用 os.Exit(1)
log.Fatalf格式化輸出日志并退出
log.Panic輸出日志并引發 panic
log.Panicln格式化輸出日志并引發 panic
log.SetFlags設置日志格式(日期、時間等)
log.SetOutput設置日志輸出目標
3. 示例代碼
package main  import (  "log"  "os"  
)  func main() {  // 1. 默認輸出到標準錯誤  log.Println("這是一條普通日志")  // 2. 格式化輸出  name := "Alice"  age := 30  log.Printf("用戶 %s 已經 %d 歲了\n", name, age)  // 3. 設置日志輸出目標為文件  file, err := os.OpenFile("log.txt", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)  if err != nil {  log.Fatal(err)  }  log.SetOutput(file)  log.Println("日志已切換到文件輸出")  // 4. 設置日志格式(默認包含時間信息)  log.SetFlags(log.LstdFlags)  //Ldate         = 1 << iota     // 使用本地時區的日期:2009/01/23//Ltime                         // 使用本地時區的時間:01:23:23//Lmicroseconds                 // 微秒精度的時間:01:23:23.123123。假設啟用了Ltime//Llongfile                     // 完整文件名和行號:/a/b/c/d.go:23//Lshortfile                    // 文件名的最后一部分和行號:d.go:23。覆蓋Llongfile//LUTC                          // 如果設置了Ldate或Ltime,則使用UTC而不是本地時區//Lmsgprefix                    // 將“前綴”從行首移動到消息之前//LstdFlags     = Ldate | Ltime // 標準logger的初始值,包含日期和時間log.Println("這是一條包含時間的日志")  log.Panic("Panic\n")//log.Fatal("Fatal\n")
}  
4. 優勢和局限
  • 優勢
    • 內置庫,使用簡單,不需要額外依賴。
    • 支持基本的日志輸出和格式化。
  • 局限
    • 功能較簡單,不支持多日志級別(如 DEBUG、INFO、WARNING 等)。
    • 不支持 JSON 格式化輸出。
    • 不支持日志輪轉(logrotate)。

二、第三方庫?logrus?詳解

1. 功能特點

logrus?是 Go 語言中一個功能強大的日志庫,主要特點如下:

  • 支持多種日志級別:DebugInfoWarningErrorFatalPanic
  • 支持兩種輸出格式:text?和?json
  • 支持日志輪轉(結合?lumberjack?包)
  • 支持鉤子(Hooks)機制,擴展日志處理邏輯
  • 支持多種輸出目標(文件、網絡、console 等)
2. 核心功能

以下是?logrus?的核心功能:

? ????????1 .多日志級別

logger.Debug("調試日志")  
logger.Info("信息日志")  
logger.Warn("警告日志")  
logger.Error("錯誤日志")  
logger.Fatal("致命錯誤")  
logger.Panic("panic 日志")  

????????2. 格式化輸出

logger.WithFields(logrus.Fields{  "username": "Alice",  "age":       30,  
}).Info("用戶信息")  

? ? ? ? 3. 切換輸出格式

// 切換到 JSON 格式  
logger.SetFormatter(&logrus.JSONFormatter{})  
// 配置日志格式為 text(默認)
//logger.SetFormatter(&logrus.TextFormatter{})

? ? ? ? 4.設置日志輸出目標

logger.SetOutput(os.Stdout) // 輸出到標準輸出  

? ? ? ? 5. 日志輪轉(結合 lumberjack)

// 須import(lumberjack "gopkg.in/natefinch/lumberjack.v2"
)
writer := &lumberjack.Logger{  Filename:   "logs/app.log",  MaxSize:     500, // MB  MaxBackups:  3,  MaxAge:      28, // days  Compress:   true,  
}  
logger.SetOutput(writer)  
3. 示例代碼

以下是一個完整的?logrus?示例代碼,包含日志級別、格式化、文件輪轉和鉤子功能:

package main  import (  "log"  "os"  "os/signal"  "syscall"  "time"  lumberjack "gopkg.in/natefinch/lumberjack.v2" "github.com/sirupsen/logrus"  
)  func main() {  // 1. 創建 logger 實例  logger := logrus.New()  // 2. 配置日志級別  logger.SetLevel(logrus.InfoLevel)  // 3. 配置日志格式為 JSON  logger.SetFormatter(&logrus.JSONFormatter{})  // 4. 配置日志輪轉  writer := &lumberjack.Logger{  Filename:   "logs/app.log",  MaxSize:     500, // MB  MaxBackups:  3,  MaxAge:      28, // days  Compress:   true,  }  logger.SetOutput(writer)  // 5. 添加鉤子(Hook)  logger.AddHook(&MyHook{})  // 6. 寫入日志  logger.Info("這是一個 Info 級別的日志")  // 7. 帶字段的日志  logger.WithFields(logrus.Fields{  "username": "Bob",  "age":      25,  }).Error("用戶未找到")  // 8. 處理信號  signalChan := make(chan os.Signal, 1)  signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)  go func() {  <-signalChan  logger.Info("程序已優雅退出")  os.Exit(0)  }()  
}  // 自定義鉤子示例  
type MyHook struct{}  func (*MyHook) Levels() []logrus.Level {  return []logrus.Level{  logrus.InfoLevel,  logrus.ErrorLevel,  }  
}  func (*MyHook) Fire(entry *logrus.Entry) error {  // 鉤子邏輯:例如發送日志到遠程服務器  log.Printf("鉤子處理:%+v\n", entry)  return nil  
}  
4. 優勢和擴展性
  • 優勢
    • 功能強大,支持多日志級別和格式化。
    • 高度可定制,支持鉤子機制和多種輸出目標。
    • 社區生態豐富,廣泛應用于生產環境。
  • 擴展性
    • 支持第三方庫擴展(如日志輪轉、網絡輸出等)。

三、總結

1. 何時選擇?log
  • 當項目的日志需求簡單(只需要基本的日志輸出)。
  • 項目不希望引入額外的依賴。
2. 何時選擇?logrus
  • 項目需要多日志級別和格式化輸出。
  • 需要更高的可定制性和擴展性。
  • 需要支持日志輪轉和鉤子機制。
3. 對比總結
特性loglogrus
日志級別有限(Fatal、Error)多級別(Debug~Panic)
格式化輸出支持支持(Text/JSON)
日志輪轉不支持支持(需配合 lumberjack)
鉤子機制不支持支持
輸出目標標準輸出/文件多種(文件、網絡等)
社區和擴展性內置庫第三方庫,社區豐富

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

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

相關文章

消費品行業創新創業中品類創新與數字化工具的融合:以開源 AI 智能客服、AI 智能名片及 S2B2C 商城小程序為例

摘要&#xff1a; 本文聚焦于消費品行業的創新與創業&#xff0c;深入探討“選擇大于努力”這一觀點&#xff0c;強調品類選擇在品牌發展中的關鍵作用。同時&#xff0c;詳細分析了品類創新對于新消費品牌崛起以及傳統品牌轉型的重要意義。在此基礎上&#xff0c;引入開源 AI 智…

Razer macOS v0.4.10快速安裝

鏈接點這里下載最新的 .dmg 文件。將下載的 .dmg 映像文件拖入 應用程序 文件夾中。若首次打開時出現安全警告【什么扔到廢紙簍】&#xff0c;這時候點擊 Mac 的“系統偏好設置”-> “安全性與隱私”-> “通用”&#xff0c;然后點擊底部的 “打開”。【或者仍然打開】 對…

Flask項目部署:Flask + uWSGI + Nginx

目錄 1,網絡架構 2,環境安裝 2.1,安裝yum:Shell軟件包管理器 2.2 安裝python 2.3 安裝uWSGI 2.4 安裝Flask 3,上傳工程包到服務器,打包Flask項目 4,創建和配置 uwsgi 配置文件 uwsgi.ini 4.1配置文件 4.2配置文件注釋詳解 5,啟動服務 6,安裝nginx 7,nginx配置 8,…

[FPGA基礎學習]實現流水燈與按鍵暫停

FPGA實現LED流水燈 1.vscode的安裝和使用 vscode下載 Visual Studio Code - Code Editing. Redefined vscode插件&#xff08;Verilog-HDL/SystemVerilog&#xff09;下載 quartus綁定vscode 2.用6個LED完成周期為1秒的跑馬燈效果 流水燈模塊設計 時鐘輸入 DE2-115開發板…

【TensorRT】TensorRT從安裝到推理——Python 環境下 MobileNetV4 三分類任務

我想開發一個基于深度學習的分類小軟件&#xff0c;逐漸了解到了TensorRT在模型推理速度上的優勢&#xff0c;經過一下午資料的查找實現了將onnx模型轉為TensorRT格式模型的推理及測試過程。將實現過程記錄下來方便日后查看。 本文實驗設備是MX350顯卡 2G顯存 一 、安裝Tenso…

1.兩數之和(Java)

1. 題目描述 LeetCode 1. 兩數之和&#xff08;Two Sum&#xff09; 給定一個整數數組 nums 和一個目標值 target&#xff0c;請你在該數組中找出和為目標值的那兩個整數&#xff0c;并返回它們的索引。 示例 1&#xff1a; 輸入&#xff1a;nums [2,7,11,15], target 9 …

《深入探索 Python 數據分析:用 Pandas 高效處理與可視化大型數據集》

《深入探索 Python 數據分析:用 Pandas 高效處理與可視化大型數據集》 引言:從零到分析高手 數據是當代社會最寶貴的資源,而數據分析技能是現代職業人不可或缺的一部分。在數據科學的領域中,Python 已成為當之無愧的“首選語言”,其強大的生態系統和簡潔的語法讓人如虎添…

將樹莓派5當做Ollama服務器,C#調用generate的API的示例

其實完全沒這個必要&#xff0c;性能用腳后跟想都會很差。但基于上一篇文章的成果&#xff0c;來都來了就先簡單試試吧。 先來看看這個拼夕夕上五百多塊錢能達到的效果&#xff1a; 只要對速度沒要求&#xff0c;那感覺就還行。 Ollama默認只在本地回環&#xff08;127.0.0…

python基礎學習二(列表及字典的使用)

文章目錄 列表列表的創建獲取列表中的多個元素判斷列表中元素是否存在列表元素的添加操作列表元素的刪除操作列表元素的修改列表的排序列表生成式 字典字典的創建字典的常規操作字典的常用操作字典的視圖操作字典元素的遍歷字典的特點字典的生成式 列表 一個對象由id&#xff0…

Android設計模式之代理模式

一、定義&#xff1a; 為其他對象提供一種代理以控制對這個對象的訪問。 二、角色組成&#xff1a; Subject抽象主題&#xff1a;聲明真是主題與代理的共同接口方法&#xff0c;可以是一個抽象類或接口。 RealSubject真實主題&#xff1a;定義了代理表示的真實對象&#xff0c…

國外計算機證書推薦(考證)(6 Sigma、AWS、APICS、IIA、Microsoft、Oracle、PMI、Red Hat)

文章目錄 證書推薦1. 六西格瑪 (6 Sigma)2. 亞馬遜網絡服務 (AWS)3. 美國生產與庫存控制學會 (APICS)4. 內部審計師協會 (IIA)5. 微軟 (Microsoft)6. 甲骨文 (Oracle)7. 項目管理協會 (PMI)8. 紅帽 (Red Hat) 證書推薦 1. 六西格瑪 (6 Sigma) 介紹&#xff1a;六西格瑪是一種…

用mkdocs寫文檔#自動更新github-page

https://wuyisheng.github.io/blog 背景是上一篇博客 使用mkdocs&#xff0c;最后提及可以部署github page。這里說明下怎么自動部署。 當然&#xff0c;這篇博客主要的目的還是提供下github page的鏈接 &#xff1a;&#xff09; 我是這樣做的&#xff1a; step 1: pip3 i…

QT五 文件系統,QFile,QfileInfo

總覽 QIODevice&#xff1a;所有 I/O 設備類的父類&#xff0c;提供了字節塊讀寫的通用操作以及基本接口&#xff1b;QFileDevice&#xff1a;Qt5新增加的類&#xff0c;提供了有關文件操作的通用實現。QFlie&#xff1a;訪問本地文件或者嵌入資源&#xff1b;QTemporaryFile&a…

EF Core表達式樹

文章目錄 前言一、表達式樹與委托的區別二、動態構建表達式樹示例1示例2示例3高級技巧&#xff1a;表達式合并 三、ExpressionTreeToString安裝方法基本用法支持的格式化風格 四、注意事項總結 前言 在 Entity Framework Core 中&#xff0c;表達式樹&#xff08;Expression T…

NVM安裝速通使用手冊(Windows版)NVM管理node版本命令手冊 NVM使用手冊

nvm&#xff08;Node Version Manager&#xff09;是一個用于管理Node.js版本的命令行工具。通過nvm&#xff0c;你可以在同一臺機器上安裝和切換多個Node.js版本&#xff0c;非常適合開發和測試在不同Node.js版本上運行的應用程序 一、安裝地址 1. 官方下載&#xff1a; &…

vLLM命令行使用方法詳解

vLLM 是一個針對大語言模型(LLMs)優化的高效推理和服務庫。以下是 vLLM 命令行工具的詳細使用方法解析,涵蓋常見場景和參數配置: 一、核心命令行工具 vLLM 提供兩個主要的命令行入口: 啟動 API 服務器 用于部署 HTTP/OpenAI 兼容的 API 服務: python -m vllm.entrypoint…

# 基于 OpenCV 的選擇題自動批改系統實現

在教育領域&#xff0c;選擇題的批改工作通常較為繁瑣且重復性高。為了提高批改效率&#xff0c;我們可以利用計算機視覺技術&#xff0c;通過 OpenCV 實現選擇題的自動批改。本文將詳細介紹如何使用 Python 和 OpenCV 實現一個簡單的選擇題自動批改系統。 1. 項目背景 選擇題…

python黑科技:無痛修改第三方庫源碼

需求不符合 很多時候&#xff0c;我們下載的 第三方庫 是不會有需求不滿足的情況&#xff0c;但也有極少的情況&#xff0c;第三方庫 沒有兼顧到需求&#xff0c;導致開發者無法實現相關功能。 如何通過一些操作將 第三方庫 源碼進行修改&#xff0c;是我們將要遇到的一個難點…

第十三章:優化內存管理_《C++性能優化指南》_notes

優化內存管理 一、內存管理基礎概念二、自定義分配器三、智能指針優化重點知識代碼示例&#xff1a;智能指針性能對比 四、性能優化關鍵點總結多選題設計題答案與詳解多選題答案設計題示例答案&#xff08;第1題&#xff09; 一、內存管理基礎概念 重點知識 動態內存分配開銷…

python筆記之函數

函數初探 python在要寫出函數很簡單&#xff0c;通過關鍵字def即可寫出&#xff0c;簡單示例如下 def add(a, b):return ab 以上即可以定義出一個簡單的函數&#xff1a;接收兩個變量a和b&#xff0c;返回a和b相加的結果&#xff0c;當然這么說也不全對&#xff0c;原因就是…