/
gorm_logger.go
128 lines (111 loc) · 3.66 KB
/
gorm_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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package gorm_log
import (
"context"
"errors"
"fmt"
"time"
"github.com/coreservice-io/log"
gormlogger "gorm.io/gorm/logger"
"gorm.io/gorm/utils"
)
// LogLevel
type LogLevel int32
const (
Silent LogLevel = iota + 1
Error
Warn
Info
)
type Config struct {
SlowThreshold time.Duration
IgnoreRecordNotFoundError bool
LogLevel LogLevel
}
type gormLocalLogger struct {
LocalLogger log.Logger
gormLogLevel gormlogger.LogLevel
SlowThreshold time.Duration
IgnoreRecordNotFoundError bool
infoStr, warnStr, errStr string
traceStr, traceErrStr, traceWarnStr string
}
func New_gormLocalLogger(log log.Logger, config Config) *gormLocalLogger {
l := &gormLocalLogger{
LocalLogger: log,
infoStr: "%s\n[info] ",
warnStr: "%s\n[warn] ",
errStr: "%s\n[error] ",
traceStr: "%s\n[%.3fms] [rows:%v] %s",
traceWarnStr: "%s %s\n[%.3fms] [rows:%v] %s",
traceErrStr: "%s %s\n[%.3fms] [rows:%v] %s",
}
if config.SlowThreshold == 0 {
config.SlowThreshold = 500 * time.Millisecond
}
if config.LogLevel == 0 {
config.LogLevel = LogLevel(gormlogger.Warn)
}
l.SlowThreshold = config.SlowThreshold
l.IgnoreRecordNotFoundError = config.IgnoreRecordNotFoundError
l.gormLogLevel = gormlogger.LogLevel(config.LogLevel)
return l
}
func (l *gormLocalLogger) LogMode(level gormlogger.LogLevel) gormlogger.Interface {
newlogger := *l
newlogger.gormLogLevel = level
return &newlogger
}
func (l *gormLocalLogger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) {
if l.gormLogLevel <= gormlogger.Silent {
return
}
elapsed := time.Since(begin)
switch {
case err != nil && l.gormLogLevel >= gormlogger.Error && (!errors.Is(err, gormlogger.ErrRecordNotFound) || !l.IgnoreRecordNotFoundError):
sql, rows := fc()
var s string
if rows == -1 {
s = fmt.Sprintf(l.traceErrStr, utils.FileWithLineNum(), err, float64(elapsed.Nanoseconds())/1e6, "-", sql)
} else {
s = fmt.Sprintf(l.traceErrStr, utils.FileWithLineNum(), err, float64(elapsed.Nanoseconds())/1e6, rows, sql)
}
l.LocalLogger.Errorln(s)
case elapsed > l.SlowThreshold && l.SlowThreshold != 0 && l.gormLogLevel >= gormlogger.Warn:
sql, rows := fc()
var s string
slowLog := fmt.Sprintf("SLOW SQL >= %v", l.SlowThreshold)
if rows == -1 {
s = fmt.Sprintf(l.traceWarnStr, utils.FileWithLineNum(), slowLog, float64(elapsed.Nanoseconds())/1e6, "-", sql)
} else {
s = fmt.Sprintf(l.traceWarnStr, utils.FileWithLineNum(), slowLog, float64(elapsed.Nanoseconds())/1e6, rows, sql)
}
l.LocalLogger.Warnln(s)
case l.gormLogLevel == gormlogger.Info:
sql, rows := fc()
var s string
if rows == -1 {
s = fmt.Sprintf(l.traceStr, utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, "-", sql)
} else {
s = fmt.Sprintf(l.traceStr, utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, rows, sql)
}
l.LocalLogger.Infoln(s)
}
}
func (l *gormLocalLogger) Info(ctx context.Context, msg string, data ...interface{}) {
if l.gormLogLevel >= gormlogger.Info {
s := fmt.Sprintf(l.infoStr+msg, append([]interface{}{utils.FileWithLineNum()}, data...)...)
l.LocalLogger.Infoln(s)
}
}
func (l *gormLocalLogger) Warn(ctx context.Context, msg string, data ...interface{}) {
if l.gormLogLevel >= gormlogger.Warn {
s := fmt.Sprintf(l.warnStr+msg, append([]interface{}{utils.FileWithLineNum()}, data...)...)
l.LocalLogger.Warnln(s)
}
}
func (l *gormLocalLogger) Error(ctx context.Context, msg string, data ...interface{}) {
if l.gormLogLevel >= gormlogger.Error {
s := fmt.Sprintf(l.errStr+msg, append([]interface{}{utils.FileWithLineNum()}, data...)...)
l.LocalLogger.Errorln(s)
}
}