golang 日志log與logrus示例詳解
一、Go 標準庫 log 詳解
1. 功能特點
log
是 Go 語言標準庫中一個簡單的日志庫,主要功能包括:
- 寫入日志到指定位置(默認為標準錯誤)
- 支持_FATAL 和 _ERROR 等級別的日志
- 支持格式化日志輸出
2. 常用函數(shù)
log
包中常用的函數(shù)如下:
函數(shù)名 | 功能 |
---|---|
log.Print | 輸出日志 |
log.Printf | 格式化輸出日志 |
log.Println | 輸出日志,自動換行 |
log.Fatal | 輸出日志并調(diào)用 os.Exit(1) |
log.Fatalf | 格式化輸出日志并退出 |
log.Panic | 輸出日志并引發(fā) panic |
log.Panicln | 格式化輸出日志并引發(fā) panic |
log.SetFlags | 設(shè)置日志格式(日期、時間等) |
log.SetOutput | 設(shè)置日志輸出目標 |
3. 示例代碼
package main import ( "log" "os" ) func main() { // 1. 默認輸出到標準錯誤 log.Println("這是一條普通日志") // 2. 格式化輸出 name := "Alice" age := 30 log.Printf("用戶 %s 已經(jīng) %d 歲了\n", name, age) // 3. 設(shè)置日志輸出目標為文件 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. 設(shè)置日志格式(默認包含時間信息) log.SetFlags(log.LstdFlags) //Ldate = 1 << iota // 使用本地時區(qū)的日期:2009/01/23 //Ltime // 使用本地時區(qū)的時間:01:23:23 //Lmicroseconds // 微秒精度的時間:01:23:23.123123。假設(shè)啟用了Ltime //Llongfile // 完整文件名和行號:/a/b/c/d.go:23 //Lshortfile // 文件名的最后一部分和行號:d.go:23。覆蓋Llongfile //LUTC // 如果設(shè)置了Ldate或Ltime,則使用UTC而不是本地時區(qū) //Lmsgprefix // 將“前綴”從行首移動到消息之前 //LstdFlags = Ldate | Ltime // 標準logger的初始值,包含日期和時間 log.Println("這是一條包含時間的日志") log.Panic("Panic\n") //log.Fatal("Fatal\n") }
4. 優(yōu)勢和局限
優(yōu)勢:
- 內(nèi)置庫,使用簡單,不需要額外依賴。
- 支持基本的日志輸出和格式化。
局限:
- 功能較簡單,不支持多日志級別(如 DEBUG、INFO、WARNING 等)。
- 不支持 JSON 格式化輸出。
- 不支持日志輪轉(zhuǎn)(logrotate)。
二、第三方庫 logrus 詳解
1. 功能特點
logrus
是 Go 語言中一個功能強大的日志庫,主要特點如下:
- 支持多種日志級別:
Debug
、Info
、Warning
、Error
、Fatal
、Panic
- 支持兩種輸出格式:
text
和json
- 支持日志輪轉(zhuǎn)(結(jié)合
lumberjack
包) - 支持鉤子(Hooks)機制,擴展日志處理邏輯
- 支持多種輸出目標(文件、網(wǎng)絡、console 等)
2. 核心功能
以下是 logrus
的核心功能:
1 .多日志級別
logger.Debug("調(diào)試日志") 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.設(shè)置日志輸出目標
logger.SetOutput(os.Stdout) // 輸出到標準輸出
5. 日志輪轉(zhuǎn)(結(jié)合 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
示例代碼,包含日志級別、格式化、文件輪轉(zhuǎn)和鉤子功能:
package main import ( "log" "os" "os/signal" "syscall" "time" lumberjack "gopkg.in/natefinch/lumberjack.v2" "github.com/sirupsen/logrus" ) func main() { // 1. 創(chuàng)建 logger 實例 logger := logrus.New() // 2. 配置日志級別 logger.SetLevel(logrus.InfoLevel) // 3. 配置日志格式為 JSON logger.SetFormatter(&logrus.JSONFormatter{}) // 4. 配置日志輪轉(zhuǎn) 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("程序已優(yōu)雅退出") 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 { // 鉤子邏輯:例如發(fā)送日志到遠程服務器 log.Printf("鉤子處理:%+v\n", entry) return nil }
4. 優(yōu)勢和擴展性
- 優(yōu)勢:
- 功能強大,支持多日志級別和格式化。
- 高度可定制,支持鉤子機制和多種輸出目標。
- 社區(qū)生態(tài)豐富,廣泛應用于生產(chǎn)環(huán)境。
- 擴展性:
- 支持第三方庫擴展(如日志輪轉(zhuǎn)、網(wǎng)絡輸出等)。
三、總結(jié)
1. 何時選擇 log
?
- 當項目的日志需求簡單(只需要基本的日志輸出)。
- 項目不希望引入額外的依賴。
2. 何時選擇 logrus
?
- 項目需要多日志級別和格式化輸出。
- 需要更高的可定制性和擴展性。
- 需要支持日志輪轉(zhuǎn)和鉤子機制。
3. 對比總結(jié)
特性 | log | logrus |
---|---|---|
日志級別 | 有限(Fatal、Error) | 多級別(Debug~Panic) |
格式化輸出 | 支持 | 支持(Text/JSON) |
日志輪轉(zhuǎn) | 不支持 | 支持(需配合 lumberjack) |
鉤子機制 | 不支持 | 支持 |
輸出目標 | 標準輸出/文件 | 多種(文件、網(wǎng)絡等) |
社區(qū)和擴展性 | 內(nèi)置庫 | 第三方庫,社區(qū)豐富 |
到此這篇關(guān)于golang 日志log與logrus的文章就介紹到這了,更多相關(guān)golang 日志log與logrus內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang 在windows中設(shè)置環(huán)境變量的操作
這篇文章主要介紹了golang 在windows中設(shè)置環(huán)境變量的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04Go中基本數(shù)據(jù)類型和字符串表示之間轉(zhuǎn)換詳解
這篇文章主要為大家詳細介紹了Go中基本數(shù)據(jù)類型和字符串表示之間轉(zhuǎn)換的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2024-01-01