package logger import ( "log" "go.uber.org/zap" ) var Log *zap.Logger var Sugar *zap.SugaredLogger var Std *log.Logger func Init(env string) error { opt := zap.AddStacktrace(zap.ErrorLevel) // error 日志打印堆栈信息 var err error if env == "pro" { // Log, err = zap.NewProduction(opt) Log, err = newProduction(opt) log.Println("zap init newProduction") } else { // Log, err = zap.NewDevelopment(opt) Log, err = newDevelopment(opt) log.Println("zap init newDevelopment") } if err == nil { Sugar = Log.Sugar() } zap.ReplaceGlobals(Log) // 全局logger,zap.L() 和 zap.S() 需要调用 ReplaceGlobals 函数才会记录日志信息 // 之后可以使用zap.L()代替Log,zap.S()代替Sugar Std = zap.NewStdLog(Log) // 标准输入自动转换为 zap.logger日志 return err } func newProduction(options ...zap.Option) (*zap.Logger, error) { config := zap.Config{ Level: zap.NewAtomicLevelAt(zap.WarnLevel), Development: false, Sampling: &zap.SamplingConfig{ Initial: 100, Thereafter: 100, }, Encoding: "json", EncoderConfig: zap.NewProductionEncoderConfig(), OutputPaths: []string{"stderr"}, ErrorOutputPaths: []string{"stderr"}, } return config.Build(options...) } func newDevelopment(options ...zap.Option) (*zap.Logger, error) { config := zap.Config{ Level: zap.NewAtomicLevelAt(zap.DebugLevel), Development: true, Encoding: "console", EncoderConfig: zap.NewDevelopmentEncoderConfig(), OutputPaths: []string{"stderr"}, ErrorOutputPaths: []string{"stderr"}, } return config.Build(options...) }