85 lines
2.8 KiB
Go
85 lines
2.8 KiB
Go
// Package log define log struct of wave record project
|
||
package log
|
||
|
||
import (
|
||
"os"
|
||
"sync"
|
||
|
||
"modelRT/constant"
|
||
|
||
"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 {
|
||
Mode string `json:"mode"` // Mode 日志模式 development、production
|
||
Level string `json:"level"` // Level 最低日志等级,DEBUG<INFO<WARN<ERROR<FATAL INFO-->收集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 {
|
||
encoderConfig := zap.NewProductionEncoderConfig()
|
||
// serialization time eg:2006-01-02 15:04:05
|
||
encoderConfig.EncodeTime = zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05")
|
||
encoderConfig.TimeKey = "time"
|
||
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
|
||
encoderConfig.EncodeCaller = zapcore.ShortCallerEncoder
|
||
return zapcore.NewJSONEncoder(encoderConfig)
|
||
}
|
||
|
||
// getLogWriter responsible for setting the location of log storage
|
||
func getLogWriter(mode, 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
|
||
}
|
||
|
||
syncConsole := zapcore.AddSync(os.Stderr)
|
||
if mode == constant.DevelopmentLogMode {
|
||
return syncConsole
|
||
}
|
||
|
||
syncFile := zapcore.AddSync(lumberJackLogger)
|
||
return zapcore.NewMultiWriteSyncer(syncFile, syncConsole)
|
||
}
|
||
|
||
// initLogger return successfully initialized zap logger
|
||
func initLogger(lCfg CutLogConfig) *zap.Logger {
|
||
writeSyncer := getLogWriter(lCfg.Mode, 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
|
||
}
|