package logger import ( "strconv" //"github.com/natefinch/lumberjack" rotatelogs "github.com/lestrrat-go/file-rotatelogs" "go.uber.org/zap" "go.uber.org/zap/zapcore" "time" ) var ( fileLogCoreMap map[string]*zap.Logger ) type fileDriver struct { level int logger *zap.Logger } func NewFileDriver(config file, level int) (driver, error) { var logCore *zap.Logger if fileLogCoreMap == nil { fileLogCoreMap = make(map[string]*zap.Logger) } mKey := config.Filename+strconv.Itoa(config.MaxAge) logCore = fileLogCoreMap[mKey] if logCore == nil { //lumberjackLogger := &lumberjack.Logger{ // Filename: config.Filename, // MaxSize: config.MaxSize, // MaxAge: config.MaxAge, // MaxBackups: config.MaxBackups, // Compress: config.Compress, //} age := time.Hour * 24 * time.Duration(config.MaxAge) hook, err := rotatelogs.New( config.Filename+".%Y%m%d", rotatelogs.WithLinkName(config.Filename), rotatelogs.WithMaxAge(age), rotatelogs.WithRotationTime(time.Hour*24), ) if err != nil { return nil, err } writeSync := zapcore.AddSync(hook) coreEncoder := zap.NewProductionEncoderConfig() coreEncoder.EncodeLevel = zapcore.CapitalLevelEncoder encoder := zapcore.NewJSONEncoder(coreEncoder) core := zapcore.NewCore(encoder, writeSync, zap.DebugLevel) logCore = zap.New(core) fileLogCoreMap[mKey] = logCore } return &fileDriver{level, logCore}, nil } func (f *fileDriver) Record(message message) { if (message.Level == debugLevel || message.Level == DebugLevel) && f.level == debugLevelInt { f.logger.Debug(message.Content, zap.String("Extra", message.Extra), zap.Int("Pid", message.Pid), zap.String("Module", message.Module), zap.String("Operator", message.Operator), zap.String("Caller", message.Caller), zap.String("Date", message.Date), zap.String("Time", message.Time)) } else if (message.Level == infoLevel || message.Level == InfoLevel) && f.level <= infoLevelInt { f.logger.Info(message.Content, zap.String("Extra", message.Extra), zap.Int("Pid", message.Pid), zap.String("Module", message.Module), zap.String("Operator", message.Operator), zap.String("Caller", message.Caller), zap.String("Date", message.Date), zap.String("Time", message.Time)) } else if (message.Level == warnLevel || message.Level == WarnLevel) && f.level <= warnLevelInt { f.logger.Warn(message.Content, zap.String("Extra", message.Extra), zap.Int("Pid", message.Pid), zap.String("Module", message.Module), zap.String("Operator", message.Operator), zap.String("Caller", message.Caller), zap.String("Date", message.Date), zap.String("Time", message.Time)) } else if (message.Level == errorLevel || message.Level == ErrorLevel) && f.level <= errorLevelInt { f.logger.Error(message.Content, zap.String("Extra", message.Extra), zap.Int("Pid", message.Pid), zap.String("Module", message.Module), zap.String("Operator", message.Operator), zap.String("Caller", message.Caller), zap.String("Date", message.Date), zap.String("Time", message.Time)) } else if (message.Level == fatalLevel || message.Level == FatalLevel) && f.level <= fatalLevelInt { f.logger.Fatal(message.Content, zap.String("Extra", message.Extra), zap.Int("Pid", message.Pid), zap.String("Module", message.Module), zap.String("Operator", message.Operator), zap.String("Caller", message.Caller), zap.String("Date", message.Date), zap.String("Time", message.Time)) } }