-
Notifications
You must be signed in to change notification settings - Fork 0
/
db_logger.go
113 lines (98 loc) · 3.44 KB
/
db_logger.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package db
import (
"context"
"errors"
"fmt"
"go.uber.org/zap"
"gorm.io/gorm"
gormLogger "gorm.io/gorm/logger"
"gorm.io/gorm/utils"
"time"
)
type databaseLogger struct {
zap *zap.SugaredLogger
LogLevel gormLogger.LogLevel
SlowThreshold time.Duration
IgnoreRecordNotFoundError bool
}
var _ gormLogger.Interface = &databaseLogger{}
type LoggerConfig struct {
LogLevel gormLogger.LogLevel
SlowThreshold time.Duration
IgnoreRecordNotFoundError bool
}
func NewDevelopmentGormLoggerConfig() LoggerConfig {
return LoggerConfig{
LogLevel: gormLogger.Info,
SlowThreshold: time.Second,
IgnoreRecordNotFoundError: false,
}
}
func NewProductionGormLoggerConfig() LoggerConfig {
return LoggerConfig{
LogLevel: gormLogger.Error,
SlowThreshold: 3 * time.Second,
IgnoreRecordNotFoundError: true,
}
}
func (loggerConfig LoggerConfig) BuildWith(zap *zap.SugaredLogger) gormLogger.Interface {
return NewGormLogger(zap, loggerConfig)
}
func NewGormLogger(zap *zap.SugaredLogger, databaseLoggerConfig LoggerConfig) gormLogger.Interface {
return &databaseLogger{
zap: zap,
LogLevel: databaseLoggerConfig.LogLevel,
SlowThreshold: databaseLoggerConfig.SlowThreshold,
IgnoreRecordNotFoundError: databaseLoggerConfig.IgnoreRecordNotFoundError,
}
}
func (d *databaseLogger) LogMode(level gormLogger.LogLevel) gormLogger.Interface {
newLogger := *d
newLogger.LogLevel = level
return &newLogger
}
func (d *databaseLogger) Info(ctx context.Context, msg string, data ...interface{}) {
if d.LogLevel >= gormLogger.Info {
d.zap.Info(append([]interface{}{zap.String("msg", msg), utils.FileWithLineNum()}, data...)...)
}
}
func (d *databaseLogger) Warn(ctx context.Context, msg string, data ...interface{}) {
if d.LogLevel >= gormLogger.Warn {
d.zap.Warn(append([]interface{}{zap.String("msg", msg), utils.FileWithLineNum()}, data...)...)
}
}
func (d *databaseLogger) Error(ctx context.Context, msg string, data ...interface{}) {
if d.LogLevel >= gormLogger.Error {
d.zap.Error(append([]interface{}{zap.String("msg", msg), utils.FileWithLineNum()}, data...)...)
}
}
func (d *databaseLogger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) {
if d.LogLevel <= gormLogger.Silent {
return
}
elapsed := time.Since(begin)
switch {
case err != nil && d.LogLevel >= gormLogger.Error && (!errors.Is(err, gorm.ErrRecordNotFound) || !d.IgnoreRecordNotFoundError):
sql, rows := fc()
if rows == -1 {
d.zap.Error(utils.FileWithLineNum(), err, float64(elapsed.Nanoseconds())/1e6, "-", sql)
} else {
d.zap.Error(utils.FileWithLineNum(), err, float64(elapsed.Nanoseconds())/1e6, rows, sql)
}
case elapsed > d.SlowThreshold && d.SlowThreshold != 0 && d.LogLevel >= gormLogger.Warn:
sql, rows := fc()
slowLog := fmt.Sprintf("SLOW SQL >= %v", d.SlowThreshold)
if rows == -1 {
d.zap.Warn("warn", utils.FileWithLineNum(), slowLog, float64(elapsed.Nanoseconds())/1e6, "-", sql)
} else {
d.zap.Warn("warn", utils.FileWithLineNum(), slowLog, float64(elapsed.Nanoseconds())/1e6, rows, sql)
}
case d.LogLevel == gormLogger.Info:
sql, rows := fc()
if rows == -1 {
d.zap.Info("trace", utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, "-", sql)
} else {
d.zap.Info("trace", utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, rows, sql)
}
}
}