package logger import ( "go.uber.org/zap" "go.uber.org/zap/zapcore" "gopkg.in/natefinch/lumberjack.v2" "log" "os" "path/filepath" "strconv" "time" ) // GetEncoder 负责设置 encoding 的日志格式 func GetEncoder(color bool) zapcore.Encoder { // 获取一个指定的的EncoderConfig,进行自定义 encodeConfig := zap.NewProductionEncoderConfig() // 序列化时间。eg: 2022-09-01T19:11:35.921+0800 encodeConfig.EncodeTime = zapcore.ISO8601TimeEncoder // "time":"2022-09-01T19:11:35.921+0800" encodeConfig.TimeKey = "time" // 将Level序列化为全大写字符串。例如,将info level序列化为INFO。 if color { encodeConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder } else { encodeConfig.EncodeLevel = zapcore.CapitalLevelEncoder } // 以 package/file:行 的格式 序列化调用程序,从完整路径中删除除最后一个目录外的所有目录。 encodeConfig.EncodeCaller = zapcore.ShortCallerEncoder return zapcore.NewConsoleEncoder(encodeConfig) } func NewCore(lCfg *LogConfig) zapcore.Core { encoder := GetEncoder(false) now := strconv.FormatInt(time.Now().Unix(), 10) fileName := filepath.Join(lCfg.FilePath, now+".log") ljLogger := &lumberjack.Logger{ Filename: fileName, // 文件位置 MaxSize: lCfg.MaxSize, // 进行切割之前,日志文件的最大大小(MB为单位) MaxAge: lCfg.MaxAge, // 保留旧文件的最大天数 MaxBackups: lCfg.MaxBackups, // 保留旧文件的最大个数 Compress: lCfg.Compress, // 是否压缩/归档旧文件 } level, err := zapcore.ParseLevel(lCfg.Level) if err != nil { log.Fatalln(err) } return zapcore.NewCore(encoder, zapcore.AddSync(ljLogger), level) } func NewMultiCore(lCfg *LogConfig) zapcore.Core { now := strconv.FormatInt(time.Now().Unix(), 10) level, err := zapcore.ParseLevel(lCfg.Level) if err != nil { log.Fatalln(err) } infoEncoder := GetEncoder(false) infoFileName := filepath.Join(lCfg.FilePath, now+".log") infoLogger := &lumberjack.Logger{ Filename: infoFileName, // 文件位置 MaxSize: lCfg.MaxSize, // 进行切割之前,日志文件的最大大小(MB为单位) MaxAge: lCfg.MaxAge, // 保留旧文件的最大天数 MaxBackups: lCfg.MaxBackups, // 保留旧文件的最大个数 Compress: lCfg.Compress, // 是否压缩/归档旧文件 } infoPrior := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { return lvl >= level && lvl < zap.ErrorLevel && lvl >= zap.DebugLevel }) infoCore := zapcore.NewCore(infoEncoder, zapcore.AddSync(infoLogger), infoPrior) errEncoder := GetEncoder(true) errFileName := filepath.Join(lCfg.FilePath, now+"-error.log") errLogger := &lumberjack.Logger{ Filename: errFileName, // 文件位置 MaxSize: lCfg.MaxSize, // 进行切割之前,日志文件的最大大小(MB为单位) MaxAge: lCfg.MaxAge, // 保留旧文件的最大天数 MaxBackups: lCfg.MaxBackups, // 保留旧文件的最大个数 Compress: lCfg.Compress, // 是否压缩/归档旧文件 } errPrior := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { return lvl >= level && lvl >= zap.ErrorLevel }) errCore := zapcore.NewCore(errEncoder, zapcore.NewMultiWriteSyncer(zapcore.AddSync(errLogger), zapcore.AddSync(os.Stdout)), errPrior) var coreArr []zapcore.Core coreArr = append(coreArr, infoCore, errCore) return zapcore.NewTee(coreArr...) }