97 lines
2.4 KiB
Go
97 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
|
||
|
||
Info func(msg string, fields ...zap.Field)
|
||
Warn func(msg string, fields ...zap.Field)
|
||
Debug func(msg string, fields ...zap.Field)
|
||
Error func(msg string, fields ...zap.Field)
|
||
)
|
||
|
||
const (
|
||
debug = true
|
||
logPath = "./logs"
|
||
logTime = 7
|
||
)
|
||
|
||
func init() {
|
||
Logger = newLogger()
|
||
|
||
Info = Logger.Info
|
||
Warn = Logger.Warn
|
||
Debug = Logger.Debug
|
||
Error = Logger.Error
|
||
}
|
||
|
||
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("2006-01-02 15:04:05"))
|
||
},
|
||
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 debug {
|
||
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())
|
||
}
|
||
|
||
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
|
||
}
|