tkcashgame_v4/pkg/log/zaplog/zap.go

122 lines
4.1 KiB
Go
Raw Normal View History

2025-10-22 10:01:11 +00:00
// Package zaplog 封装zap日志库主程序文件
// @Description: 二次封装开源zap日志库
// @File: zaplog
package zaplog
import (
"fmt"
"io"
"os"
"time"
"github.com/natefinch/lumberjack"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
// Logger 全局变量,导出给调用者使用
var Logger *zap.Logger
// Init 初始化日志相关目录
func Init(config Config) error {
// 创建日志根目录
if _, err := os.Stat(config.BaseDirectoryName); os.IsNotExist(err) {
err := os.MkdirAll(config.BaseDirectoryName, os.ModePerm)
if err != nil {
return fmt.Errorf("error creating directory, err: %v", err)
}
}
// 创建日志子目录
if err := os.MkdirAll(fmt.Sprintf("%s/%s", config.BaseDirectoryName, config.InfoDirectoryName), os.ModePerm); err != nil {
return fmt.Errorf("error creating info directory, err: %v", err)
}
if err := os.MkdirAll(fmt.Sprintf("%s/%s", config.BaseDirectoryName, config.WarnDirectoryName), os.ModePerm); err != nil {
return fmt.Errorf("error creating warn directory, err: %v", err)
}
if err := os.MkdirAll(fmt.Sprintf("%s/%s", config.BaseDirectoryName, config.ErrorDirectoryName), os.ModePerm); err != nil {
return fmt.Errorf("error creating err directory, err: %v", err)
}
// 自定义初始化zap库
initLogger(config)
return nil
}
// getWriter 获取wirter文件写入
func getWriter(logBasePath, logLevelPath, LogFileName string, config Config) io.Writer {
return &lumberjack.Logger{
Filename: fmt.Sprintf("%s/%s/%s", logBasePath, logLevelPath, LogFileName),
MaxBackups: config.LogFileMaxBackups,
MaxSize: config.LogFileMaxSize,
MaxAge: config.LogFileMaxAge,
Compress: config.LogFileCompress,
}
}
// initLog 初始化日志
func initLogger(c Config) {
// 获取io.Writer实现
infoWriter := getWriter(c.BaseDirectoryName, c.InfoDirectoryName, c.InfoFileName, c)
warnWriter := getWriter(c.BaseDirectoryName, c.WarnDirectoryName, c.WarnFileName, c)
errWriter := getWriter(c.BaseDirectoryName, c.ErrorDirectoryName, c.ErrorFileName, c)
// 获取日志默认配置
encoderConfig := zap.NewProductionEncoderConfig()
// 自定义日志输出格式
// 修改TimeKey
encoderConfig.TimeKey = "time"
// 修改MessageKey
encoderConfig.MessageKey = "message"
// 时间格式符合人类观看
encoderConfig.EncodeTime = func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString(t.Format("2006-01-02 15:04:05.000"))
}
// 日志等级大写INFO
encoderConfig.EncodeLevel = func(lvl zapcore.Level, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString(lvl.CapitalString())
}
// 日志打印时所处代码位置
encoderConfig.EncodeCaller = func(caller zapcore.EntryCaller, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString(caller.TrimmedPath())
}
// 加载自定义配置为json格式
encoder := zapcore.NewJSONEncoder(encoderConfig)
// 自定义日志级别 info
infoLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl <= zap.InfoLevel && lvl >= zap.DebugLevel
})
// 自定义日志级别 warn
warnLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl <= zap.WarnLevel && lvl > zap.InfoLevel
})
// 自定义日志级别 err
errLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl <= zap.FatalLevel && lvl > zap.WarnLevel
})
// 日志文件输出位置
var core zapcore.Core
if c.LogPrintTag {
//同时在文件和终端输出日志
core = zapcore.NewTee(
zapcore.NewCore(encoder, zapcore.AddSync(infoWriter), infoLevel), // info级别日志
zapcore.NewCore(encoder, zapcore.AddSync(warnWriter), warnLevel), // warn级别日志
zapcore.NewCore(encoder, zapcore.AddSync(errWriter), errLevel), // error级别日志
zapcore.NewCore(encoder, zapcore.Lock(os.Stdout), zap.DebugLevel),
)
} else {
//只在文件输出日志
core = zapcore.NewTee(
zapcore.NewCore(encoder, zapcore.AddSync(infoWriter), infoLevel), // info级别日志
zapcore.NewCore(encoder, zapcore.AddSync(warnWriter), warnLevel), // warn级别日志
zapcore.NewCore(encoder, zapcore.AddSync(errWriter), errLevel), // error级别日志
)
}
Logger = zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1))
}