107 lines
2.4 KiB
Go
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
|
|
}
|