modelRT/logger/zap.go

86 lines
2.4 KiB
Go
Raw Normal View History

// Package logger define log struct of modelRT project
2024-12-25 16:34:57 +08:00
package logger
import (
"os"
"sync"
2024-11-28 11:46:40 +08:00
"modelRT/config"
"modelRT/constant"
"github.com/natefinch/lumberjack"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
var (
2024-11-27 15:41:22 +08:00
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 == constant.DevelopmentLogMode {
return syncConsole
}
syncFile := zapcore.AddSync(lumberJackLogger)
return zapcore.NewMultiWriteSyncer(syncFile, syncConsole)
}
// initLogger return successfully initialized zap logger
2024-11-28 11:46:40 +08:00
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() {
2024-11-27 15:41:22 +08:00
_globalLogger = initLogger(lCfg)
})
defer _globalLogger.Sync()
2024-11-27 15:41:22 +08:00
}
// GetLoggerInstance define func of returns the global logger instance It's safe for concurrent use.
func GetLoggerInstance() *zap.Logger {
2024-11-27 15:41:22 +08:00
_globalLoggerMu.RLock()
logger := _globalLogger
_globalLoggerMu.RUnlock()
return logger
}