Golang?logrus?的入門教程
1.logrus 是什么?
logrus 是一款流行的 Golang 日志庫,具有非常靈活的配置選項。它支持多種日志級別、日志格式和輸出方式,包括文本格式和 JSON 格式的輸出,以及在控制臺輸出、文件輸出、發(fā)送到遠(yuǎn)程服務(wù)、發(fā)送到 Slack 等。logrus 也可以通過 Hooks 實現(xiàn)日志的異步輸出和處理。
總的來說,logrus 使用方便,功能齊全,適合大部分項目的日志記錄需求。
2.logrus 快速上手
1.安裝 logrus
使用 go get 命令安裝 logrus:
go get github.com/sirupsen/logrus
2.創(chuàng)建 Logger 對象
在程序中引入 logrus 包,并創(chuàng)建一個 Logger 對象:
import "github.com/sirupsen/logrus" var log = logrus.New()
當(dāng)然,你也可以使用全局缺省的 Logger 對象 std。其定義如下:
var (
// std is the name of the standard logger in stdlib `log`
std = New()
)
// Creates a new logger. Configuration should be set by changing `Formatter`,
// `Out` and `Hooks` directly on the default logger instance. You can also just
// instantiate your own:
//
// var log = &logrus.Logger{
// Out: os.Stderr,
// Formatter: new(logrus.TextFormatter),
// Hooks: make(logrus.LevelHooks),
// Level: logrus.DebugLevel,
// }
//
// It's recommended to make this a global instance called `log`.
func New() *Logger {
return &Logger{
Out: os.Stderr,
Formatter: new(TextFormatter),
Hooks: make(LevelHooks),
Level: InfoLevel,
ExitFunc: os.Exit,
ReportCaller: false,
}
}3.配置 Logger 對象
可以通過 Logger 對象的方法來配置 Logger,例如設(shè)置日志輸出格式、設(shè)置日志級別等等。以下是一個例子:
log.SetFormatter(&logrus.TextFormatter{})
log.SetLevel(logrus.DebugLevel)4.打印日志
可以使用 Logger 對象的方法來打印日志,例如:
log.Info("This is an info log.")
log.Warn("This is a warning log.")
log.Error("This is an error log.")可以通過不同的方法來打印不同級別的日志,常見日志級別有 Trace、Debug、Info、Warn、Error 和 Fatal。
5.輸出日志
Logger 對象默認(rèn)將日志輸出到 os.Stderr,可以通過 Logger 對象的 Out 屬性來指定輸出到其他的 io.Writer,例如:
log.Out = os.Stdout
可以通過Logger對象的Hook屬性來添加Hook,實現(xiàn)異步輸出和處理日志的需求,例如:
log.Hooks.Add(hook)
這些就是logrus的基本使用方法,可以根據(jù)具體需求來使用logrus的其他高級功能。
3.logrus 實現(xiàn)日志滾動
在實際開發(fā)過程中,為了節(jié)省磁盤和方便查看,日志需要按照時間或者大小維度進(jìn)行切割分成多分歸檔過期的日志,刪除久遠(yuǎn)的日志.這個就是在日常開發(fā)中經(jīng)常遇見的日志滾動(log rotation)。
那么在 logrus 中我們該如何實現(xiàn)這個功能呢? logrus 本身并沒有實現(xiàn)滾動日志功能,但是我們可以使用第三方滾動插件實現(xiàn)。
我們可以使用 lumberjack 實現(xiàn) logrus 的滾動日志,具體實現(xiàn)如下:
package main
import (
log "github.com/Sirupsen/logrus"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
logger := &lumberjack.Logger{
// 日志輸出文件路徑。
Filename: "/var/log/myapp/foo.log",
// 日志文件最大 size, 單位是 MB。
MaxSize: 100,
// 最大過期日志保留的個數(shù)。
MaxBackups: 10,
// 保留過期文件的最大時間間隔,單位天。
MaxAge: 30,
// 是否需要壓縮滾動日志, 使用的 gzip 壓縮,缺省為 false。
Compress: true,
}
log.SetOutput(logger) // 設(shè)置 logrus 的 io.Writer
}滾動日志的各項參數(shù)如注釋所示,logrus 的 setOutput() 函數(shù)的入?yún)⑹?io.Writer 類型,lumberjack.Logger 實現(xiàn)了該接口。
4.一個完整的示例
這里使用 logrus 缺省的 Logger 對象,對其進(jìn)行各項配置。
import (
"fmt"
"io"
"os"
"github.com/sirupsen/logrus"
lumberjack "gopkg.in/natefinch/lumberjack.v2"
)
// Level 日志級別。建議從服務(wù)配置讀取。
var LogConf = struct {
Dir string `yaml:"dir"`
Name string `yaml:"name"`
Level string `yaml:"level"`
MaxSize int `yaml:"max_size"`
}{
Dir: "./logs",
Name: "yourlogname.log",
Level: "trace",
MaxSize: 100,
}
// Init logrus logger.
func InitLogger() error {
// 設(shè)置日志格式。
logrus.SetFormatter(&logrus.TextFormatter{
TimestampFormat: "2006-01-02 15:04:05.000",
})
switch Level {
case "trace":
logrus.SetLevel(logrus.TraceLevel)
case "debug":
logrus.SetLevel(logrus.DebugLevel)
case "info":
logrus.SetLevel(logrus.InfoLevel)
case "warn":
logrus.SetLevel(logrus.WarnLevel)
case "error":
logrus.SetLevel(logrus.ErrorLevel)
case "fatal":
logrus.SetLevel(logrus.FatalLevel)
case "panic":
logrus.SetLevel(logrus.PanicLevel)
}
logrus.SetReportCaller(true) // 打印文件、行號和主調(diào)函數(shù)。
// 實現(xiàn)日志滾動。
// Refer to https://www.cnblogs.com/jssyjam/p/11845475.html.
logger := &lumberjack.Logger{
Filename: fmt.Sprintf("%v/%v", LogConf.Dir, LogConf.Name), // 日志輸出文件路徑。
MaxSize: LogConf.MaxSize, // 日志文件最大 size(MB),缺省 100MB。
MaxBackups: 10, // 最大過期日志保留的個數(shù)。
MaxAge: 30, // 保留過期文件的最大時間間隔,單位是天。
LocalTime: true, // 是否使用本地時間來命名備份的日志。
}
// 同時輸出到標(biāo)準(zhǔn)輸出與文件。
logrus.SetOutput(io.MultiWriter(logger, os.Stdout))
return nil
}5.小結(jié)
logrus 還有很多高級的用法,如有需要,可以深入研究。
此外,除了 logrus,Golang 還有很多好用的日志庫,以下是幾個比較流行的:
- log
Golang 自帶了一個 log 包,可以滿足基本的日志需求。這個包有幾個函數(shù):Print、Printf、Println、Fatal、Fatalf、Fatalln、Panic、Panicf、Panicln,可以滿足大部分日志的打印和處理需求。
- zap
zap 是 Uber 開源的一款高性能日志庫,它支持多種日志級別和輸出方式,包括console、json、file等等。zap 的性能比較優(yōu)秀,它使用了 Zero Allocation 的設(shè)計理念,在不影響性能的情況下盡量避免內(nèi)存分配。
各大公司在選擇日志組件時,使用 zap 居多。
- zerolog
zerolog 是一款輕量級的日志庫,具有非常好的性能和可擴(kuò)展性。它支持多種日志級別、輸出格式和輸出方式,包括 console、json、file 等等。zerolog 的設(shè)計理念是簡單、易用、高性能,代碼量也比較少。
總的來說,以上幾個日志庫都具有不同的優(yōu)點和適用場景,可以根據(jù)具體需求選擇使用。
到此這篇關(guān)于Golang logrus 快速上手的文章就介紹到這了,更多相關(guān)Golang logrus 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言實現(xiàn)二維數(shù)組的2種遍歷方式以及案例詳解
這篇文章主要介紹了Go語言實現(xiàn)二維數(shù)組的2種遍歷方式以及案例詳解,圖文代碼聲情并茂,有感興趣的可以學(xué)習(xí)下2021-03-03
go語言beego框架jwt身份認(rèn)證實現(xiàn)示例
這篇文章主要為大家介紹了go語言beego框架jwt身份認(rèn)證實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
Golang基礎(chǔ)之函數(shù)使用(參數(shù)傳值)實例詳解
這篇文章主要為大家介紹了Golang基礎(chǔ)之函數(shù)使用(參數(shù)傳值)實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
Go語言常見錯誤之濫用getters/setters誤區(qū)實例探究
在Go語言編程中,恰如其分地使用getters和setters是至關(guān)重要的,過度和不適當(dāng)?shù)厥褂盟鼈兛赡軐?dǎo)致代碼冗余、可讀性差和封裝不當(dāng),在本文中,我們將深入探討如何識別濫用getter和setter的情況,以及如何采取最佳實踐來避免這些常見的Go錯誤2024-01-01

