2024-07-24 16:41:19 +08:00
|
|
|
|
// 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
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2024-07-26 10:50:40 +08:00
|
|
|
|
// CutLogConfig define log config of wave record project
|
|
|
|
|
|
type CutLogConfig struct {
|
2024-07-24 16:41:19 +08:00
|
|
|
|
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 {
|
|
|
|
|
|
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
|
2024-07-26 10:50:40 +08:00
|
|
|
|
func initLogger(lCfg CutLogConfig) *zap.Logger {
|
2024-07-24 16:41:19 +08:00
|
|
|
|
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
|
2024-07-26 10:50:40 +08:00
|
|
|
|
func GetLoggerInstance(lCfg CutLogConfig) *zap.Logger {
|
2024-07-24 16:41:19 +08:00
|
|
|
|
once.Do(func() {
|
|
|
|
|
|
logger = initLogger(lCfg)
|
|
|
|
|
|
})
|
|
|
|
|
|
return logger
|
|
|
|
|
|
}
|