Files
vRp.CD2g_test/utils/log/log.go
T
2023-05-05 10:54:33 +08:00

107 lines
2.4 KiB
Go

package log
import (
"fmt"
rotatelogs "github.com/lestrrat-go/file-rotatelogs"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"io"
"os"
"time"
)
var (
logger *zap.Logger
prod bool
)
const (
logPath = "./logs"
logTime = 7
)
func init() {
logger = newLogger()
}
func newLogger() *zap.Logger {
encoder := zapcore.NewConsoleEncoder(zapcore.EncoderConfig{
MessageKey: "msg",
LevelKey: "level",
EncodeLevel: zapcore.CapitalLevelEncoder,
TimeKey: "ts",
EncodeTime: func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString(t.Format(time.DateTime))
},
CallerKey: "file",
EncodeCaller: zapcore.ShortCallerEncoder,
EncodeDuration: func(d time.Duration, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendInt64(int64(d) / 1000000)
},
})
infoLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl == zapcore.InfoLevel
})
debugLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl <= zapcore.FatalLevel
})
warnLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= zapcore.ErrorLevel
})
var cores zapcore.Core
if !prod {
cores = zapcore.NewTee(
zapcore.NewCore(encoder, zapcore.AddSync(os.Stdout), debugLevel),
)
} else {
infoWriter := getWriter(fmt.Sprintf("%s/info.log", logPath), logTime)
warnWriter := getWriter(fmt.Sprintf("%s/error.log", logPath), logTime)
cores = zapcore.NewTee(
zapcore.NewCore(encoder, zapcore.AddSync(infoWriter), infoLevel),
zapcore.NewCore(encoder, zapcore.AddSync(warnWriter), warnLevel),
)
}
return zap.New(cores, zap.AddCaller(), zap.AddCallerSkip(1))
}
func getWriter(filename string, times int32) io.Writer {
// 生成rotatelogs的Logger 实际生成的文件名 demo.log.YYmmddHH
// demo.log是指向最新日志的链接
// //保存7天内的日志,每天分割一次日志
hook, err := rotatelogs.New(
filename+".%Y%m%d", // 没有使用go风格反人类的format格式
rotatelogs.WithLinkName(filename),
rotatelogs.WithMaxAge(time.Hour*24*7),
rotatelogs.WithRotationTime(time.Hour*time.Duration(times)),
)
if err != nil {
panic(err)
}
return hook
}
func Info(msg string, fields ...zap.Field) {
logger.Info(msg, fields...)
}
func Warn(msg string, fields ...zap.Field) {
logger.Warn(msg, fields...)
}
func Debug(msg string, fields ...zap.Field) {
logger.Debug(msg, fields...)
}
func Error(msg string, fields ...zap.Field) {
logger.Error(msg, fields...)
}
func SetProd() {
prod = true
}