4 回答

TA貢獻1827條經驗 獲得超8個贊
用 zaps 的實現替換默認的 go Global 記錄器是可能的,但不鼓勵。
為什么要包含包全局記錄器?由于許多其他日志記錄包都包含全局記錄器,因此許多應用程序并未設計為接受記錄器作為顯式參數。更改函數簽名通常是一個重大更改,因此 zap 包含全局記錄器來簡化遷移。
盡可能避免它們。
根據您的需要,您可以在 main 中創建一個記錄器并將其傳遞,或者在每個包中創建一個新的記錄器。我選擇在 main 中創建一個并將其傳遞,因為我使用的是 Atomic 記錄器,它允許我在應用程序通過 API 調用運行時更改日志級別。有著使用 DI 和整合代碼的悠久歷史,它確實感覺像代碼味道,但顯然它對于 zap 如何通過單例或全局傳遞它的性能明顯更高。

TA貢獻1757條經驗 獲得超7個贊
您可以在主函數中設置記錄器并調用zap.ReplaceGlobals
以將其用作默認的全局記錄器。
ReplaceGlobals 替換全局 Logger 和 SugaredLogger,并返回一個函數來恢復原始值。并發使用是安全的。

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
}

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 ""
}
- 4 回答
- 0 關注
- 182 瀏覽
添加回答
舉報