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
|
||
}
|