目錄
一、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 語言中一個功能強大的日志庫,主要特點如下:
- 支持多種日志級別:
Debug
、Info
、Warning
、Error
、Fatal
、Panic
- 支持兩種輸出格式:
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. 對比總結
特性 | log | logrus |
---|---|---|
日志級別 | 有限(Fatal、Error) | 多級別(Debug~Panic) |
格式化輸出 | 支持 | 支持(Text/JSON) |
日志輪轉 | 不支持 | 支持(需配合 lumberjack) |
鉤子機制 | 不支持 | 支持 |
輸出目標 | 標準輸出/文件 | 多種(文件、網絡等) |
社區和擴展性 | 內置庫 | 第三方庫,社區豐富 |