// Package log define log struct of wave record project package log import ( "os" "sync" "github.com/natefinch/lumberjack" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) var ( logger *zap.Logger once sync.Once ) // CutLogConfig define log config of wave record project type CutLogConfig struct { Level string `json:"level"` // Level 最低日志等级,DEBUG收集INFO等级以上的日志 FileName string `json:"file_name"` // FileName 日志文件位置 MaxSize int `json:"max_size"` // MaxSize 进行切割之前,日志文件的最大大小(MB为单位)默认为100MB MaxAge int `json:"max_age"` // MaxAge 是根据文件名中编码的时间戳保留旧日志文件的最大天数。 MaxBackups int `json:"max_backups"` // MaxBackups 是要保留的旧日志文件的最大数量。默认是保留所有旧的日志文件(尽管 MaxAge 可能仍会导致它们被删除) } // getEncoder responsible for setting the log format for encoding func getEncoder() zapcore.Encoder { encodeConfig := zap.NewProductionEncoderConfig() // serialization time eg:2006-01-02 15:04:05 encodeConfig.EncodeTime = zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05") encodeConfig.TimeKey = "time" encodeConfig.EncodeLevel = zapcore.CapitalLevelEncoder encodeConfig.EncodeCaller = zapcore.ShortCallerEncoder return zapcore.NewJSONEncoder(encodeConfig) } // getLogWriter responsible for setting the location of log storage func getLogWriter(filename string, maxsize, maxBackup, maxAge int) zapcore.WriteSyncer { lumberJackLogger := &lumberjack.Logger{ Filename: filename, // log file position MaxSize: maxsize, // log file maxsize MaxAge: maxAge, // maximum number of day files retained MaxBackups: maxBackup, // maximum number of old files retained Compress: false, // whether to compress } syncFile := zapcore.AddSync(lumberJackLogger) // TODO:增加调试输出到控制台设置,其他模式无控制台数据 syncConsole := zapcore.AddSync(os.Stderr) return zapcore.NewMultiWriteSyncer(syncFile, syncConsole) } // initLogger return successfully initialized zap logger func initLogger(lCfg CutLogConfig) *zap.Logger { writeSyncer := getLogWriter(lCfg.FileName, lCfg.MaxSize, lCfg.MaxBackups, lCfg.MaxAge) encoder := getEncoder() l := new(zapcore.Level) err := l.UnmarshalText([]byte(lCfg.Level)) if err != nil { panic(err) } core := zapcore.NewCore(encoder, writeSyncer, l) logger = zap.New(core, zap.AddCaller()) zap.ReplaceGlobals(logger) return logger } // GetLoggerInstance return instance of zap logger func GetLoggerInstance(lCfg CutLogConfig) *zap.Logger { once.Do(func() { logger = initLogger(lCfg) }) return logger }