You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

90 lines
3.3 KiB

package logger
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
"log"
"os"
"path/filepath"
"strconv"
"time"
)
// GetEncoder 负责设置 encoding 的日志格式
func GetEncoder(color bool) zapcore.Encoder {
// 获取一个指定的的EncoderConfig,进行自定义
encodeConfig := zap.NewProductionEncoderConfig()
// 序列化时间。eg: 2022-09-01T19:11:35.921+0800
encodeConfig.EncodeTime = zapcore.ISO8601TimeEncoder
// "time":"2022-09-01T19:11:35.921+0800"
encodeConfig.TimeKey = "time"
// 将Level序列化为全大写字符串。例如,将info level序列化为INFO。
if color {
encodeConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
} else {
encodeConfig.EncodeLevel = zapcore.CapitalLevelEncoder
}
// 以 package/file:行 的格式 序列化调用程序,从完整路径中删除除最后一个目录外的所有目录。
encodeConfig.EncodeCaller = zapcore.ShortCallerEncoder
return zapcore.NewConsoleEncoder(encodeConfig)
}
func NewCore(lCfg *LogConfig) zapcore.Core {
encoder := GetEncoder(false)
now := strconv.FormatInt(time.Now().Unix(), 10)
fileName := filepath.Join(lCfg.FilePath, now+".log")
ljLogger := &lumberjack.Logger{
Filename: fileName, // 文件位置
MaxSize: lCfg.MaxSize, // 进行切割之前,日志文件的最大大小(MB为单位)
MaxAge: lCfg.MaxAge, // 保留旧文件的最大天数
MaxBackups: lCfg.MaxBackups, // 保留旧文件的最大个数
Compress: lCfg.Compress, // 是否压缩/归档旧文件
}
level, err := zapcore.ParseLevel(lCfg.Level)
if err != nil {
log.Fatalln(err)
}
return zapcore.NewCore(encoder, zapcore.AddSync(ljLogger), level)
}
func NewMultiCore(lCfg *LogConfig) zapcore.Core {
now := strconv.FormatInt(time.Now().Unix(), 10)
level, err := zapcore.ParseLevel(lCfg.Level)
if err != nil {
log.Fatalln(err)
}
infoEncoder := GetEncoder(false)
infoFileName := filepath.Join(lCfg.FilePath, now+".log")
infoLogger := &lumberjack.Logger{
Filename: infoFileName, // 文件位置
MaxSize: lCfg.MaxSize, // 进行切割之前,日志文件的最大大小(MB为单位)
MaxAge: lCfg.MaxAge, // 保留旧文件的最大天数
MaxBackups: lCfg.MaxBackups, // 保留旧文件的最大个数
Compress: lCfg.Compress, // 是否压缩/归档旧文件
}
infoPrior := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= level && lvl < zap.ErrorLevel && lvl >= zap.DebugLevel
})
infoCore := zapcore.NewCore(infoEncoder, zapcore.AddSync(infoLogger), infoPrior)
errEncoder := GetEncoder(true)
errFileName := filepath.Join(lCfg.FilePath, now+"-error.log")
errLogger := &lumberjack.Logger{
Filename: errFileName, // 文件位置
MaxSize: lCfg.MaxSize, // 进行切割之前,日志文件的最大大小(MB为单位)
MaxAge: lCfg.MaxAge, // 保留旧文件的最大天数
MaxBackups: lCfg.MaxBackups, // 保留旧文件的最大个数
Compress: lCfg.Compress, // 是否压缩/归档旧文件
}
errPrior := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= level && lvl >= zap.ErrorLevel
})
errCore := zapcore.NewCore(errEncoder,
zapcore.NewMultiWriteSyncer(zapcore.AddSync(errLogger), zapcore.AddSync(os.Stdout)), errPrior)
var coreArr []zapcore.Core
coreArr = append(coreArr, infoCore, errCore)
return zapcore.NewTee(coreArr...)
}