116 lines
3.3 KiB
Go
116 lines
3.3 KiB
Go
package lxzap
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
"time"
|
|
|
|
"go.uber.org/zap"
|
|
"gorm.io/gorm"
|
|
gormlogger "gorm.io/gorm/logger"
|
|
)
|
|
|
|
type Logger struct {
|
|
ZapLogger *zap.Logger
|
|
LogLevel gormlogger.LogLevel
|
|
SlowThreshold time.Duration
|
|
SkipCallerLookup bool
|
|
IgnoreRecordNotFoundError bool
|
|
}
|
|
|
|
func NewGormZap(zapLogger *zap.Logger) Logger {
|
|
return Logger{
|
|
ZapLogger: zapLogger,
|
|
//LogLevel: gormlogger.Warn,
|
|
//SlowThreshold: 1000 * time.Millisecond,
|
|
LogLevel: gormlogger.Info,
|
|
SlowThreshold: 1 * time.Millisecond,
|
|
SkipCallerLookup: false,
|
|
IgnoreRecordNotFoundError: true,
|
|
}
|
|
}
|
|
|
|
func (l Logger) SetAsDefault() {
|
|
gormlogger.Default = l
|
|
}
|
|
|
|
func (l Logger) LogMode(level gormlogger.LogLevel) gormlogger.Interface {
|
|
return Logger{
|
|
ZapLogger: l.ZapLogger,
|
|
SlowThreshold: l.SlowThreshold,
|
|
LogLevel: level,
|
|
SkipCallerLookup: l.SkipCallerLookup,
|
|
IgnoreRecordNotFoundError: l.IgnoreRecordNotFoundError,
|
|
}
|
|
}
|
|
|
|
func (l Logger) Info(ctx context.Context, str string, args ...interface{}) {
|
|
if l.LogLevel < gormlogger.Info {
|
|
return
|
|
}
|
|
l.logger().Sugar().Debugf(str, args...)
|
|
}
|
|
|
|
func (l Logger) Warn(ctx context.Context, str string, args ...interface{}) {
|
|
if l.LogLevel < gormlogger.Warn {
|
|
return
|
|
}
|
|
l.logger().Sugar().Warnf(str, args...)
|
|
}
|
|
|
|
func (l Logger) Error(ctx context.Context, str string, args ...interface{}) {
|
|
if l.LogLevel < gormlogger.Error {
|
|
return
|
|
}
|
|
l.logger().Sugar().Errorf(str, args...)
|
|
}
|
|
|
|
func (l Logger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) {
|
|
spanId := ctx.Value("X-Span-ID")
|
|
if l.LogLevel <= 0 {
|
|
return
|
|
}
|
|
elapsed := time.Since(begin)
|
|
switch {
|
|
case err != nil && l.LogLevel >= gormlogger.Error && (!l.IgnoreRecordNotFoundError || !errors.Is(err, gorm.ErrRecordNotFound)):
|
|
sql, rows := fc()
|
|
l.logger().Error("trace", zap.Any("spanId", spanId), zap.Error(err), zap.Duration("elapsed", elapsed), zap.Int64("rows", rows), zap.String("sql", sql))
|
|
case l.SlowThreshold != 0 && elapsed > l.SlowThreshold && l.LogLevel >= gormlogger.Warn:
|
|
sql, rows := fc()
|
|
l.logger().Warn("trace", zap.Any("spanId", spanId), zap.Duration("elapsed", elapsed), zap.Int64("rows", rows), zap.String("sql", sql))
|
|
case l.LogLevel >= gormlogger.Info:
|
|
sql, rows := fc()
|
|
l.logger().Info("trace", zap.Any("spanId", spanId), zap.Duration("elapsed", elapsed), zap.Int64("rows", rows), zap.String("sql", sql))
|
|
}
|
|
}
|
|
|
|
var (
|
|
gormPackage = filepath.Join("gorm.io", "gorm")
|
|
zapgormPackage = filepath.Join("moul.io", "zapgorm2")
|
|
zapgormlxdb = filepath.Join("lxDb", "sql")
|
|
zapgormmodel = filepath.Join("model", "")
|
|
lxutilsPackage = filepath.Join("tool", "lxutils")
|
|
)
|
|
|
|
func (l Logger) logger() *zap.Logger {
|
|
for i := 2; i < 15; i++ {
|
|
_, file, _, ok := runtime.Caller(i)
|
|
file = filepath.Clean(file)
|
|
switch {
|
|
case !ok:
|
|
case strings.HasSuffix(file, "_test.go"):
|
|
case strings.Contains(file, gormPackage):
|
|
case strings.Contains(file, lxutilsPackage):
|
|
case strings.Contains(file, zapgormPackage):
|
|
case strings.Contains(file, zapgormlxdb):
|
|
case strings.Contains(file, zapgormmodel):
|
|
default:
|
|
return l.ZapLogger.WithOptions(zap.AddCallerSkip(i - 1))
|
|
}
|
|
}
|
|
return l.ZapLogger
|
|
}
|