modelRT/log/init.go

85 lines
2.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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
}