/
logger.go
executable file
·122 lines (107 loc) · 3.33 KB
/
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
package sdgorm
import (
"context"
"errors"
"github.com/gaorx/stardust5/sdslog"
"log"
"os"
"strings"
"time"
"github.com/gaorx/stardust5/sdtime"
"gorm.io/gorm"
gormlogger "gorm.io/gorm/logger"
gormutils "gorm.io/gorm/utils"
)
var (
LoggerDiscard = gormlogger.Discard
LoggerGormDefault = gormlogger.Default
LoggerPlainInfo = newGormLogger(gormlogger.Info, false)
LoggerPlainWarn = newGormLogger(gormlogger.Warn, false)
LoggerPlainError = newGormLogger(gormlogger.Error, false)
LoggerPlainSilent = newGormLogger(gormlogger.Silent, false)
LoggerColorfulInfo = newGormLogger(gormlogger.Info, true)
LoggerColorfulWarn = newGormLogger(gormlogger.Warn, true)
LoggerColorfulError = newGormLogger(gormlogger.Error, true)
LoggerColorfulSilent = newGormLogger(gormlogger.Silent, true)
LoggerBuiltin = newBuiltinLogger(200 * time.Millisecond)
)
func LoggerOf(name string) gormlogger.Interface {
switch strings.ToLower(name) {
case "", "default":
return LoggerDiscard
case "gorm_default":
return LoggerGormDefault
case "discard", "disable":
return LoggerDiscard
case "builtin", "stardust", "sd", "slog":
return LoggerBuiltin
case "plain_info", "info":
return LoggerPlainInfo
case "plain_warn", "warn":
return LoggerPlainWarn
case "plain_error", "error":
return LoggerPlainError
case "plain_silent", "silent":
return LoggerPlainSilent
case "colorful_info", "color_info":
return LoggerColorfulInfo
case "colorful_warn", "color_warn":
return LoggerColorfulInfo
case "colorful_error", "color_error":
return LoggerColorfulError
case "colorful_silent", "color_silent":
return LoggerColorfulSilent
default:
return LoggerDiscard
}
}
func newGormLogger(level gormlogger.LogLevel, colorful bool) gormlogger.Interface {
return gormlogger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags),
gormlogger.Config{
SlowThreshold: 200 * time.Millisecond,
LogLevel: level,
IgnoreRecordNotFoundError: false,
Colorful: colorful,
},
)
}
type builtinLogger struct {
slowThreshold time.Duration
skipErrRecordNotFound bool
}
func newBuiltinLogger(slowThreshold time.Duration) *builtinLogger {
return &builtinLogger{
slowThreshold: slowThreshold,
skipErrRecordNotFound: true,
}
}
func (l *builtinLogger) LogMode(gormlogger.LogLevel) gormlogger.Interface {
return l
}
func (l *builtinLogger) Info(ctx context.Context, s string, args ...interface{}) {
sdslog.InfofContext(ctx, s, args...)
}
func (l *builtinLogger) Warn(ctx context.Context, s string, args ...interface{}) {
sdslog.WarnfContext(ctx, s, args...)
}
func (l *builtinLogger) Error(ctx context.Context, s string, args ...interface{}) {
sdslog.ErrorfContext(ctx, s, args...)
}
func (l *builtinLogger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) {
elapsed := time.Since(begin)
sql, _ := fc()
attrs := []any{
sdslog.Float64("elapsed", sdtime.ToMillisF(elapsed)),
sdslog.String("line", gormutils.FileWithLineNum()),
}
if err != nil && !(errors.Is(err, gorm.ErrRecordNotFound) && l.skipErrRecordNotFound) {
sdslog.With(attrs...).WithError(err).ErrorContext(ctx, sql)
return
}
if l.slowThreshold != 0 && elapsed > l.slowThreshold {
sdslog.With(attrs...).WarnContext(ctx, sql)
return
}
sdslog.With(attrs...).DebugContext(ctx, sql)
}