亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何初始化 zap 記錄器一次并在其他 Go 文件中重用它?

如何初始化 zap 記錄器一次并在其他 Go 文件中重用它?

Go
慕無忌1623718 2023-07-17 16:29:21
我正在嘗試從漂亮的 Logrus(對調試非常有幫助)遷移我的應用程序,并引入 Uber 日志框架 Zap。使用 Logrus,我只能初始化記錄器一次并從其他 Go 文件中重用它,例如:package mainimport(    // Print filename on log    filename "github.com/onrik/logrus/filename"    // Very nice log library    log "github.com/sirupsen/logrus")func main(){// ==== SET LOGGING    Formatter := new(log.TextFormatter)    Formatter.TimestampFormat = "Jan _2 15:04:05.000000000"    Formatter.FullTimestamp = true    Formatter.ForceColors = true    log.AddHook(filename.NewHook()) // Print filename + line at every log    log.SetFormatter(Formatter)}從其他 Go 文件中,我可以重用該記錄器而無需任何其他初始化:// VerifyCommandLineInput is delegated to manage the inputer parameter provide with the input flag from command linefunc VerifyCommandLineInput() datastructures.Configuration {    log.Debug("VerifyCommandLineInput | Init a new configuration from the conf file")    c := flag.String("config", "./conf/test.json", "Specify the configuration file.")    flag.Parse()    if strings.Compare(*c, "") == 0 {        log.Fatal("VerifyCommandLineInput | Call the tool using --config conf/config.json")    }    file, err := os.Open(*c)    if err != nil {        log.Fatal("VerifyCommandLineInput | can't open config file: ", err)    }    defer file.Close()    decoder := json.NewDecoder(file)    cfg := datastructures.Configuration{}    err = decoder.Decode(&cfg)    if err != nil {        log.Fatal("VerifyCommandLineInput | can't decode config JSON: ", err)    }    log.Debug("VerifyCommandLineInput | Conf loaded -> ", cfg)    return cfg}我的問題是:使用 Zap 日志框架,如何在 main 函數中初始化日志并使用其他 Go 文件中的記錄器?
查看完整描述

4 回答

?
慕仙森

TA貢獻1827條經驗 獲得超8個贊

用 zaps 的實現替換默認的 go Global 記錄器是可能的,但不鼓勵。

為什么要包含包全局記錄器?由于許多其他日志記錄包都包含全局記錄器,因此許多應用程序并未設計為接受記錄器作為顯式參數。更改函數簽名通常是一個重大更改,因此 zap 包含全局記錄器來簡化遷移。

盡可能避免它們。

根據您的需要,您可以在 main 中創建一個記錄器并將其傳遞,或者在每個包中創建一個新的記錄器。我選擇在 main 中創建一個并將其傳遞,因為我使用的是 Atomic 記錄器,它允許我在應用程序通過 API 調用運行時更改日志級別。有著使用 DI 和整合代碼的悠久歷史,它確實感覺像代碼味道,但顯然它對于 zap 如何通過單例或全局傳遞它的性能明顯更高。


查看完整回答
反對 回復 2023-07-17
?
長風秋雁

TA貢獻1757條經驗 獲得超7個贊

您可以在主函數中設置記錄器并調用zap.ReplaceGlobals以將其用作默認的全局記錄器。

ReplaceGlobals 替換全局 Logger 和 SugaredLogger,并返回一個函數來恢復原始值。并發使用是安全的。


查看完整回答
反對 回復 2023-07-17
?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

我認為避免替換默認的 go 記錄器是個好主意,我的方法是為 zap 記錄器的配置和初始化創建一個單獨的包。它還提供了包裝函數實現,在將 zap 更改為另一個日志記錄工具時非常有用。

package logger

import (

? ? "go.uber.org/zap"

? ? "go.uber.org/zap/zapcore"

)


var zapLog *zap.Logger


func init() {

? ? var err error

? ? config := zap.NewProductionConfig()

? ? enccoderConfig := zap.NewProductionEncoderConfig()

? ? zapcore.TimeEncoderOfLayout("Jan _2 15:04:05.000000000")

? ? enccoderConfig.StacktraceKey = "" // to hide stacktrace info

? ? config.EncoderConfig = enccoderConfig


? ? zapLog, err = config.Build(zap.AddCallerSkip(1))

? ? if err != nil {

? ? ? ? panic(err)

? ? }

}


func Info(message string, fields ...zap.Field) {

? ? zapLog.Info(message, fields...)

}


func Debug(message string, fields ...zap.Field) {

? ? zapLog.Debug(message, fields...)

}


func Error(message string, fields ...zap.Field) {

? ? zapLog.Error(message, fields...)

}


func Fatal(message string, fields ...zap.Field) {

? ? zapLog.Fatal(message, fields...)

}

所以您的項目中的任何其他文件將如下所示


import "github.com/[your_repo_path_here]/logger"


func SomeFunc() datastructures.Configuration {

? ? logger.Debug("VerifyCommandLineInput | Init a new configuration from the conf file")

? ? c := flag.String("config", "./conf/test.json", "Specify the configuration file.")

? ? flag.Parse()if strings.Compare(*c, "") == 0 {

? ? ? ? logger.Fatal("VerifyCommandLineInput | Call the tool using --config conf/config.json")

? ? }

? ? file, err := os.Open(*c)

? ? if err != nil {

? ? ? ? logger.Fatal("VerifyCommandLineInput | can't open config file: ", err)

? ? }

? ? defer file.Close()

? ? decoder := json.NewDecoder(file)

? ? cfg := datastructures.Configuration{}

? ? err = decoder.Decode(&cfg)

? ? if err != nil {

? ? ? ? logger.Fatal("VerifyCommandLineInput | can't decode config JSON: ", err)

? ? }

? ? logger.Debug("VerifyCommandLineInput | Conf loaded -> ", cfg)


? ? return cfg

}


查看完整回答
反對 回復 2023-07-17
?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

初始化一個新日志并將其設置為全局。


package main


import(

? ? "go.uber.org/zap"

? ? "go.uber.org/zap/zapcore"

)


func initZapLog() *zap.Logger {

? ? config := zap.NewDevelopmentConfig()

? ? config.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder

? ? config.EncoderConfig.TimeKey = "timestamp"

? ? config.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder

? ? logger, _ := config.Build()

? ? return logger

}


func main() {


? ? loggerMgr := initZapLog()

? ? zap.ReplaceGlobals(loggerMgr)

? ? defer loggerMgr.Sync() // flushes buffer, if any

? ? logger := loggerMgr.Sugar()

? ? logger.Debug("START!")

? ? db2.GetToken(`alessio`, `savi`, `pass`)

? ? datastructure.LoadConfiguration()

}


您可以在其他 Go 文件中使用記錄器:


func GetToken(url, user, pass string) string {

? ? var User datastructure.User

? ? var data string

? ? var jsonData []byte


? ? User.User = user

? ? User.Pass = pass

? ? jsonData, err := json.Marshal(User)

? ? if err != nil {

? ? ? ? zap.S().Errorw("Error during marshalling...", err)

? ? ? ? return ""

? ? }

? ? data = string(jsonData)

? ? zap.S().Info("Data encoded => ", data)

? ? return ""

}


查看完整回答
反對 回復 2023-07-17
  • 4 回答
  • 0 關注
  • 182 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號