package logger import ( "beacon/config" "github.com/natefinch/lumberjack" "go.uber.org/zap" "go.uber.org/zap/zapcore" "os" ) var Lg *zap.Logger // zap日志库三要素 // 1.encoder编码 2.输出位置 3.日志级别 // Init 初始化lg func Init(cfg *config.LogConfig, mode string) (err error) { writeSyncer := getLogWriter(cfg.Filename, cfg.MaxSize, cfg.MaxBackups, cfg.MaxAge) writeErrSyncer := getLogWriter(cfg.FilenameErr, cfg.MaxSize, cfg.MaxBackups, cfg.MaxAge) encoder := getEncoder() var l = new(zapcore.Level) err = l.UnmarshalText([]byte(cfg.Level)) if err != nil { return } var core zapcore.Core if mode == "dev" { // 进入开发模式,日志输出到终端 consoleEncoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig()) core = zapcore.NewTee( zapcore.NewCore(encoder, writeSyncer, l), zapcore.NewCore(consoleEncoder, zapcore.Lock(os.Stdout), zapcore.DebugLevel), ) } else { confCore := zapcore.NewCore(encoder, writeSyncer, l) errCore := zapcore.NewCore(encoder, writeErrSyncer, zapcore.ErrorLevel) core = zapcore.NewTee(confCore, errCore) } // 复习回顾:日志默认输出到app.log,如何将err日志单独在 app.err.log 记录一份 Lg = zap.New(core, zap.AddCaller()) // zap.AddCaller() 添加调用栈信息 zap.ReplaceGlobals(Lg) // 替换zap包全局的logger zap.L().Info("init logger success") return } func getEncoder() zapcore.Encoder { encoderConfig := zap.NewProductionEncoderConfig() encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder encoderConfig.TimeKey = "time" encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder encoderConfig.EncodeDuration = zapcore.SecondsDurationEncoder encoderConfig.EncodeCaller = zapcore.ShortCallerEncoder return zapcore.NewJSONEncoder(encoderConfig) } func getLogWriter(filename string, maxSize, maxBackup, maxAge int) zapcore.WriteSyncer { lumberJackLogger := &lumberjack.Logger{ Filename: filename, MaxSize: maxSize, MaxBackups: maxBackup, MaxAge: maxAge, } return zapcore.AddSync(lumberJackLogger) }