86 lines
2.4 KiB
Go
86 lines
2.4 KiB
Go
// Package logger define log struct of modelRT project
|
|
package logger
|
|
|
|
import (
|
|
"os"
|
|
"sync"
|
|
|
|
"modelRT/config"
|
|
constants "modelRT/constant"
|
|
|
|
"github.com/natefinch/lumberjack"
|
|
"go.uber.org/zap"
|
|
"go.uber.org/zap/zapcore"
|
|
)
|
|
|
|
var (
|
|
once sync.Once
|
|
_globalLoggerMu sync.RWMutex
|
|
_globalLogger *zap.Logger
|
|
)
|
|
|
|
// 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, compress bool) 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: compress, // whether to compress
|
|
}
|
|
|
|
syncConsole := zapcore.AddSync(os.Stderr)
|
|
if mode == constants.DevelopmentLogMode {
|
|
return syncConsole
|
|
}
|
|
|
|
syncFile := zapcore.AddSync(lumberJackLogger)
|
|
return zapcore.NewMultiWriteSyncer(syncFile, syncConsole)
|
|
}
|
|
|
|
// initLogger return successfully initialized zap logger
|
|
func initLogger(lCfg config.LoggerConfig) *zap.Logger {
|
|
writeSyncer := getLogWriter(lCfg.Mode, lCfg.FilePath, lCfg.MaxSize, lCfg.MaxBackups, lCfg.MaxAge, lCfg.Compress)
|
|
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
|
|
}
|
|
|
|
// InitLoggerInstance define func of return instance of zap logger
|
|
func InitLoggerInstance(lCfg config.LoggerConfig) {
|
|
once.Do(func() {
|
|
_globalLogger = initLogger(lCfg)
|
|
})
|
|
defer _globalLogger.Sync()
|
|
}
|
|
|
|
// GetLoggerInstance define func of returns the global logger instance It's safe for concurrent use.
|
|
func GetLoggerInstance() *zap.Logger {
|
|
_globalLoggerMu.RLock()
|
|
logger := _globalLogger
|
|
_globalLoggerMu.RUnlock()
|
|
return logger
|
|
}
|