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)文章希望大家以后多多支持腳本之家!
- go語(yǔ)言中的log 包示例詳解
- Go中l(wèi)og包異或組合配置妙用詳解
- Golang日志庫(kù)logrus的介紹與使用示例代碼
- Go log庫(kù)的使用示例詳解
- Go標(biāo)準(zhǔn)庫(kù)Flag庫(kù)和Log庫(kù)的使用
- 源碼分析Golang?log是如何實(shí)現(xiàn)的
- Go?1.21.0?新增結(jié)構(gòu)化日志記錄標(biāo)準(zhǔn)庫(kù)log/slog使用詳解
- golang結(jié)構(gòu)化日志log/slog包之slog.Record的用法簡(jiǎn)介
- go中l(wèi)og包的實(shí)現(xiàn)示例
相關(guān)文章
Go語(yǔ)言基于Goroutine的超時(shí)控制方案設(shè)計(jì)與實(shí)踐
Go語(yǔ)言因其并發(fā)特性而備受青睞,尤其是goroutine和channel的組合,像一對(duì)默契的搭檔,為開(kāi)發(fā)者提供了輕量、高效的并發(fā)工具,下面我們來(lái)看看基于goroutine的超時(shí)控制方案吧2025-05-05
Golang JSON的進(jìn)階用法實(shí)例講解
這篇文章主要給大家介紹了關(guān)于Golang JSON進(jìn)階用法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用golang具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09
Go 第三方庫(kù)之類型轉(zhuǎn)換問(wèn)題
今天給大家介紹一個(gè)第三方庫(kù),專門處理類型轉(zhuǎn)換的問(wèn)題。對(duì)Go 第三方庫(kù)之類型轉(zhuǎn)換問(wèn)題感興趣的朋友跟隨小編一起看看吧2021-08-08
Go string轉(zhuǎn)int,int64,int32及注意事項(xiàng)說(shuō)明
這篇文章主要介紹了Go string轉(zhuǎn)int,int64,int32及注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

