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