121 lines
2.7 KiB
Go
121 lines
2.7 KiB
Go
package logx
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/cloudwego/hertz/pkg/common/hlog"
|
|
"go.uber.org/zap"
|
|
"go.uber.org/zap/zapcore"
|
|
"gopkg.in/natefinch/lumberjack.v2"
|
|
)
|
|
|
|
var (
|
|
// 暴露底层 zap logger 供 logreq 使用
|
|
zapLogger *zap.Logger
|
|
)
|
|
|
|
func InitLog() {
|
|
dynamicLevel := zap.NewAtomicLevel()
|
|
|
|
dynamicLevel.SetLevel(zap.DebugLevel)
|
|
|
|
logger := NewLogger(
|
|
WithCores([]CoreConfig{
|
|
{
|
|
Enc: zapcore.NewJSONEncoder(humanEncoderConfig()),
|
|
Ws: zapcore.AddSync(os.Stdout),
|
|
Lvl: dynamicLevel,
|
|
},
|
|
{
|
|
Enc: zapcore.NewJSONEncoder(humanEncoderConfig()),
|
|
Ws: getWriteSyncer("./logs/debug"),
|
|
Lvl: zap.LevelEnablerFunc(func(lev zapcore.Level) bool {
|
|
return lev == zap.DebugLevel
|
|
}),
|
|
},
|
|
{
|
|
Enc: zapcore.NewJSONEncoder(humanEncoderConfig()),
|
|
Ws: getWriteSyncer("./logs/info"),
|
|
Lvl: zap.LevelEnablerFunc(func(lev zapcore.Level) bool {
|
|
return lev == zap.InfoLevel
|
|
}),
|
|
},
|
|
{
|
|
Enc: zapcore.NewJSONEncoder(humanEncoderConfig()),
|
|
Ws: getWriteSyncer("./logs/warn"),
|
|
Lvl: zap.LevelEnablerFunc(func(lev zapcore.Level) bool {
|
|
return lev == zap.WarnLevel
|
|
}),
|
|
},
|
|
{
|
|
Enc: zapcore.NewJSONEncoder(humanEncoderConfig()),
|
|
Ws: getWriteSyncer("./logs/error"),
|
|
Lvl: zap.LevelEnablerFunc(func(lev zapcore.Level) bool {
|
|
return lev >= zap.ErrorLevel
|
|
}),
|
|
},
|
|
}...),
|
|
)
|
|
|
|
hlog.SetLogger(logger)
|
|
|
|
zapLogger = logger.Logger()
|
|
}
|
|
|
|
// humanEncoderConfig copy from zap
|
|
func humanEncoderConfig() zapcore.EncoderConfig {
|
|
return zapcore.EncoderConfig{
|
|
MessageKey: "Message",
|
|
LevelKey: "Level",
|
|
NameKey: "Name",
|
|
TimeKey: "Ts",
|
|
CallerKey: "Caller",
|
|
FunctionKey: "Func",
|
|
StacktraceKey: "Stacktrace",
|
|
LineEnding: "\n",
|
|
EncodeTime: zapcore.ISO8601TimeEncoder,
|
|
EncodeLevel: zapcore.LowercaseLevelEncoder,
|
|
EncodeDuration: zapcore.SecondsDurationEncoder,
|
|
EncodeCaller: zapcore.ShortCallerEncoder,
|
|
}
|
|
}
|
|
|
|
var (
|
|
mu sync.Mutex
|
|
currentDay = make(map[string]string)
|
|
currentSync = make(map[string]zapcore.WriteSyncer)
|
|
)
|
|
|
|
func getWriteSyncer(basePath string) zapcore.WriteSyncer {
|
|
mu.Lock()
|
|
defer mu.Unlock()
|
|
|
|
today := time.Now().Format("2006-01-02")
|
|
if day, ok := currentDay[basePath]; !ok || day != today {
|
|
currentDay[basePath] = today
|
|
file := fmt.Sprintf("%s/%s.log", basePath, today)
|
|
|
|
currentSync[basePath] = zapcore.AddSync(&lumberjack.Logger{
|
|
Filename: file,
|
|
MaxSize: 10,
|
|
MaxBackups: 50000,
|
|
MaxAge: 5,
|
|
Compress: true,
|
|
LocalTime: true,
|
|
})
|
|
}
|
|
return currentSync[basePath]
|
|
}
|
|
func Sync() error {
|
|
if zapLogger != nil {
|
|
return zapLogger.Sync()
|
|
}
|
|
return nil
|
|
}
|
|
func GetZapLogger() *zap.Logger {
|
|
return zapLogger
|
|
}
|