-
Notifications
You must be signed in to change notification settings - Fork 0
/
logger_gorm.go
124 lines (112 loc) · 3.51 KB
/
logger_gorm.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
// Package sql
package sql
import (
"context"
"time"
kitModuleDye "github.com/webnice/kit/v3/module/dye"
kmll "github.com/webnice/kit/v3/module/log/level"
kitTypes "github.com/webnice/kit/v3/types"
gormLogger "gorm.io/gorm/logger"
)
// NewLoggerGorm Создание объекта с интерфейсом gorm.logger.Interface.
func NewLoggerGorm(parent *impl) gormLogger.Interface {
var lgm = &logGorm{
parent: parent,
Loglevel: parent.cfg.Loglevel,
}
return lgm
}
// LogMode Переключение уровня логирования из ОРМ библиотеки.
func (lgm *logGorm) LogMode(l gormLogger.LogLevel) gormLogger.Interface {
switch l {
case gormLogger.Silent:
lgm.Loglevel = kmll.Off
case gormLogger.Error:
lgm.Loglevel = kmll.Error
case gormLogger.Warn:
lgm.Loglevel = kmll.Warning
case gormLogger.Info:
lgm.Loglevel = kmll.Info
default:
lgm.parent.log().
Errorf("получен не поддерживаемый уровень логирования: %d", int(l))
}
return lgm
}
// Info Все без исключения запросы к базе данных.
func (lgm *logGorm) Info(_ context.Context, s string, i ...interface{}) {
lgm.parent.log().Infof(s, i...)
}
// Warn Запросы с ошибками, а так же требующие повышенного внимания, но не являющиеся ошибкой.
func (lgm *logGorm) Warn(_ context.Context, s string, i ...interface{}) {
lgm.parent.log().Warningf(s, i...)
}
// Error Запросы, выполнение которых завершилось ошибкой.
func (lgm *logGorm) Error(_ context.Context, s string, i ...interface{}) {
lgm.parent.log().Errorf(s, i...)
}
// Trace Трассировка запросов к базе данных.
func (lgm *logGorm) Trace(
ctx context.Context,
begin time.Time,
fc func() (sql string, rowsAffected int64),
err error,
) {
const (
keyQuery, keySql = `query`, `sql`
keyDriver, keyElapsed, keyRows = `driver`, `elapsed`, `rows`
tplTracef, tplErrorf = `sql:"%s"`, `sql:"%s", ошибка: %s`
)
var (
logLevel string
elapsed time.Duration
sql string
rows int64
keys kitTypes.LoggerKey
ok bool
msgFn func(error, string)
)
// Отключение логирования из контекста.
if logLevel, ok = ctx.Value(keyContextLogLevel).(string); ok && logLevel == keyLogSilent {
return
}
elapsed = time.Since(begin)
sql, rows = fc()
keys = kitTypes.LoggerKey{
keyQuery: keySql,
keyDriver: lgm.parent.cfg.Driver,
keyElapsed: elapsed,
keyRows: rows,
}
msgFn = func(e error, color string) {
if err == nil {
return
}
//lgm.parent.log().Key(keys).Tracef(
// tplTracef,
// color+sql+kitModuleDye.New().Normal().Done().String(),
//)
lgm.parent.log().Key(keys).Errorf(
tplErrorf,
kitModuleDye.New().Yellow().Done().String()+sql+kitModuleDye.New().Reset().Done().String(),
color+e.Error()+kitModuleDye.New().Reset().Done().String(),
)
}
switch lgm.Loglevel {
case kmll.Off:
return
case kmll.Error:
msgFn(err, kitModuleDye.New().Red().Done().String())
case kmll.Warning:
msgFn(err, kitModuleDye.New().Magenta().Done().String())
case kmll.Info:
lgm.parent.log().Key(keys).Tracef(
tplTracef,
kitModuleDye.New().Yellow().Done().String()+sql+kitModuleDye.New().Normal().Done().String(),
)
default:
//lgm.parent.log().
// Errorf("не поддерживаемый уровень логирования %q", lgm.Loglevel.String())
return
}
}