package logger import ( "go.uber.org/zap" "go.uber.org/zap/zapcore" "gopkg.in/natefinch/lumberjack.v2" "os" "zhiyuan/pkg/config" ) var Sugar *zap.SugaredLogger var Log *zap.Logger type Option struct { mode string } type OptionFunc func(opt *Option) func WithMode(mode string) OptionFunc { return func(opt *Option) { opt.mode = mode } } func Setup(options ...OptionFunc) { opt := Option{ mode: "auto", } for _, fun := range options { fun(&opt) } encoder := getEncoder() writes := []zapcore.WriteSyncer{} if opt.mode == "go_test" { writes = append(writes, zapcore.AddSync(os.Stdout)) } else { writes = append(writes, getLogWriter()) if config.Cfg.Server.RunMode == "debug" { writes = append(writes, zapcore.AddSync(os.Stdout)) } } core := zapcore.NewCore( encoder, zapcore.NewMultiWriteSyncer(writes...), zapcore.DebugLevel) Log = zap.New(core, zap.AddCaller()) Log.Info("init zap log") Sugar = Log.Sugar() defer Log.Sync() } func getEncoder() zapcore.Encoder { encoderConfig := zap.NewProductionEncoderConfig() encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder return zapcore.NewConsoleEncoder(encoderConfig) } func getLogWriter() zapcore.WriteSyncer { lumberJackLogger := &lumberjack.Logger{ Filename: config.Cfg.Log.Filename, MaxSize: config.Cfg.Log.MaxSize, MaxBackups: config.Cfg.Log.MaxBackups, MaxAge: config.Cfg.Log.MaxAge, Compress: config.Cfg.Log.Compress, } return zapcore.AddSync(lumberJackLogger) }