package zaplog import ( "os" "time" "go.uber.org/zap" "go.uber.org/zap/zapcore" "gopkg.in/natefinch/lumberjack.v2" ) func textencoderConfig() zapcore.EncoderConfig { encoderConfig := zap.NewProductionEncoderConfig() //时间格式 encoderConfig.EncodeTime = func(t time.Time, enc zapcore.PrimitiveArrayEncoder) { enc.AppendString("[" + t.Format("2006-01-02 15:04:05") + "]") } //日志等级字母大写 encoderConfig.EncodeLevel = func(level zapcore.Level, enc zapcore.PrimitiveArrayEncoder) { enc.AppendString("[" + level.CapitalString() + "]") } return encoderConfig } func jsonencoderConfig() zapcore.EncoderConfig { encoderConfig := zap.NewProductionEncoderConfig() //时间格式 encoderConfig.EncodeTime = func(t time.Time, enc zapcore.PrimitiveArrayEncoder) { enc.AppendString(t.Format("2006-01-02 15:04:05")) } //日志等级字母大写 encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder return encoderConfig } func New(config ...ZapConfig) *zap.SugaredLogger { cfg := configDefault(config...) var encoder zapcore.Encoder encoder = zapcore.NewConsoleEncoder(textencoderConfig()) if cfg.JsonFormat { encoder = zapcore.NewJSONEncoder(jsonencoderConfig()) } //日志级别 error 级别 highPriority := zap.LevelEnablerFunc(func(lev zapcore.Level) bool { return lev >= zap.ErrorLevel }) //info 和 debug 级别,debug 级别是最低的 lowPriority := zap.LevelEnablerFunc(func(lev zapcore.Level) bool { return lev < zap.ErrorLevel && lev >= zap.DebugLevel }) //info文件 writeSyncer infoFileWriteSyncer := zapcore.AddSync(&lumberjack.Logger{ Filename: cfg.NormalLog.Filename, MaxSize: cfg.NormalLog.FileSize_MB, MaxBackups: cfg.NormalLog.FileBackup, MaxAge: cfg.NormalLog.FileAge_DAY, Compress: true, }) //第三个及之后的参数为写入文件的日志级别,ErrorLevel模式只记录error级别的日志 infoFileCore := zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(infoFileWriteSyncer, zapcore.AddSync(os.Stdout)), lowPriority) //error文件writeSyncer errorFileWriteSyncer := zapcore.AddSync(&lumberjack.Logger{ Filename: cfg.ErrorLog.Filename, MaxSize: cfg.ErrorLog.FileSize_MB, MaxBackups: cfg.ErrorLog.FileBackup, MaxAge: cfg.ErrorLog.FileAge_DAY, Compress: true, }) //第三个及之后的参数为写入文件的日志级别,ErrorLevel模式只记录error级别的日志 errorFileCore := zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(errorFileWriteSyncer, zapcore.AddSync(os.Stdout)), highPriority) var coreArr []zapcore.Core coreArr = append(coreArr, infoFileCore) coreArr = append(coreArr, errorFileCore) //zap.AddCaller()为显示文件名和行号,可省略 // return zap.New(zapcore.NewTee(coreArr...), zap.AddCaller()) return zap.New(zapcore.NewTee(coreArr...)).Sugar() }