Skip to content

Commit b1ae6cb

Browse files
committed
自定义gorm的logger
1 parent 9af429d commit b1ae6cb

File tree

4 files changed

+154
-0
lines changed

4 files changed

+154
-0
lines changed

server/config.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ mysql:
6060
max-idle-conns: 10
6161
max-open-conns: 100
6262
log-mode: false
63+
log-zap: false
6364

6465
# local configuration
6566
local:

server/config/gorm.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ type Mysql struct {
99
MaxIdleConns int `mapstructure:"max-idle-conns" json:"maxIdleConns" yaml:"max-idle-conns"`
1010
MaxOpenConns int `mapstructure:"max-open-conns" json:"maxOpenConns" yaml:"max-open-conns"`
1111
LogMode bool `mapstructure:"log-mode" json:"logMode" yaml:"log-mode"`
12+
LogZap bool `mapstructure:"log-zap" json:"logZap" yaml:"log-zap"`
1213
}

server/initialize/gorm.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ func GormMysql() *gorm.DB {
7373

7474
// gormConfig 根据配置决定是否开启日志
7575
func gormConfig(mod bool) *gorm.Config {
76+
if global.GVA_CONFIG.Mysql.LogZap {
77+
return &gorm.Config{
78+
Logger: Default.LogMode(logger.Info),
79+
DisableForeignKeyConstraintWhenMigrating: true,
80+
}
81+
}
7682
if mod {
7783
return &gorm.Config{
7884
Logger: logger.Default.LogMode(logger.Info),

server/initialize/logger.go

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
package initialize
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"gin-vue-admin/global"
7+
"go.uber.org/zap"
8+
"gorm.io/gorm/logger"
9+
"gorm.io/gorm/utils"
10+
"io/ioutil"
11+
"log"
12+
"os"
13+
"time"
14+
)
15+
16+
var (
17+
Discard = New(log.New(ioutil.Discard, "", log.LstdFlags), GormConfig{})
18+
Default = New(log.New(os.Stdout, "\r\n", log.LstdFlags), GormConfig{
19+
SlowThreshold: 200 * time.Millisecond,
20+
LogLevel: logger.Warn,
21+
Colorful: true,
22+
})
23+
Recorder = traceRecorder{Interface: Default, BeginAt: time.Now()}
24+
)
25+
26+
type traceRecorder struct {
27+
logger.Interface
28+
BeginAt time.Time
29+
SQL string
30+
RowsAffected int64
31+
Err error
32+
}
33+
34+
func New(writer Writer, config GormConfig) logger.Interface {
35+
var (
36+
infoStr = "%s\n[info] "
37+
warnStr = "%s\n[warn] "
38+
errStr = "%s\n[error] "
39+
traceStr = "%s\n[%.3fms] [rows:%v] %s"
40+
traceWarnStr = "%s %s\n[%.3fms] [rows:%v] %s"
41+
traceErrStr = "%s %s\n[%.3fms] [rows:%v] %s"
42+
)
43+
44+
if config.Colorful {
45+
infoStr = logger.Green + "%s\n" + logger.Reset + logger.Green + "[info] " + logger.Reset
46+
warnStr = logger.BlueBold + "%s\n" + logger.Reset + logger.Magenta + "[warn] " + logger.Reset
47+
errStr = logger.Magenta + "%s\n" + logger.Reset + logger.Red + "[error] " + logger.Reset
48+
traceStr = logger.Green + "%s\n" + logger.Reset + logger.Yellow + "[%.3fms] " + logger.BlueBold + "[rows:%v]" + logger.Reset + " %s"
49+
traceWarnStr = logger.Green + "%s " + logger.Yellow + "%s\n" + logger.Reset + logger.RedBold + "[%.3fms] " + logger.Yellow + "[rows:%v]" + logger.Magenta + " %s" + logger.Reset
50+
traceErrStr = logger.RedBold + "%s " + logger.MagentaBold + "%s\n" + logger.Reset + logger.Yellow + "[%.3fms] " + logger.BlueBold + "[rows:%v]" + logger.Reset + " %s"
51+
}
52+
53+
return &GormLogger{
54+
Writer: writer,
55+
GormConfig: config,
56+
infoStr: infoStr,
57+
warnStr: warnStr,
58+
errStr: errStr,
59+
traceStr: traceStr,
60+
traceWarnStr: traceWarnStr,
61+
traceErrStr: traceErrStr,
62+
}
63+
}
64+
65+
// Writer log writer interface
66+
type Writer interface {
67+
Printf(string, ...interface{})
68+
}
69+
70+
type GormConfig struct {
71+
SlowThreshold time.Duration
72+
Colorful bool
73+
LogLevel logger.LogLevel
74+
}
75+
76+
type GormLogger struct {
77+
Writer
78+
GormConfig
79+
infoStr, warnStr, errStr string
80+
traceStr, traceErrStr, traceWarnStr string
81+
}
82+
83+
func (g *GormLogger) LogMode(level logger.LogLevel) logger.Interface {
84+
newLogger := *g
85+
newLogger.LogLevel = level
86+
return &newLogger
87+
}
88+
89+
func (g *GormLogger) Info(ctx context.Context, message string, data ...interface{}) {
90+
if g.LogLevel >= logger.Info {
91+
g.Printf(g.infoStr+message, append([]interface{}{utils.FileWithLineNum()}, data...)...)
92+
}
93+
}
94+
95+
func (g *GormLogger) Warn(ctx context.Context, message string, data ...interface{}) {
96+
if g.LogLevel >= logger.Warn {
97+
g.Printf(g.warnStr+message, append([]interface{}{utils.FileWithLineNum()}, data...)...)
98+
}
99+
}
100+
101+
func (g *GormLogger) Error(ctx context.Context, message string, data ...interface{}) {
102+
if g.LogLevel >= logger.Error {
103+
g.Printf(g.errStr+message, append([]interface{}{utils.FileWithLineNum()}, data...)...)
104+
}
105+
}
106+
107+
func (g *GormLogger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) {
108+
if g.LogLevel > 0 {
109+
elapsed := time.Since(begin)
110+
switch {
111+
case err != nil && g.LogLevel >= logger.Error:
112+
sql, rows := fc()
113+
if rows == -1 {
114+
g.Printf(g.traceErrStr, utils.FileWithLineNum(), err, float64(elapsed.Nanoseconds())/1e6, "-", sql)
115+
} else {
116+
g.Printf(g.traceErrStr, utils.FileWithLineNum(), err, float64(elapsed.Nanoseconds())/1e6, rows, sql)
117+
}
118+
case elapsed > g.SlowThreshold && g.SlowThreshold != 0 && g.LogLevel >= logger.Warn:
119+
sql, rows := fc()
120+
slowLog := fmt.Sprintf("SLOW SQL >= %v", g.SlowThreshold)
121+
if rows == -1 {
122+
g.Printf(g.traceWarnStr, utils.FileWithLineNum(), slowLog, float64(elapsed.Nanoseconds())/1e6, "-", sql)
123+
} else {
124+
g.Printf(g.traceWarnStr, utils.FileWithLineNum(), slowLog, float64(elapsed.Nanoseconds())/1e6, rows, sql)
125+
}
126+
case g.LogLevel >= logger.Info:
127+
sql, rows := fc()
128+
if rows == -1 {
129+
g.Printf(g.traceStr, utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, "-", sql)
130+
} else {
131+
g.Printf(g.traceStr, utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, rows, sql)
132+
}
133+
}
134+
}
135+
}
136+
137+
func (g *GormLogger) Printf(message string, data ...interface{}) {
138+
global.GVA_LOG.Info(
139+
"gorm",
140+
zap.String("type", "sql"),
141+
zap.Any("src", data[0]),
142+
zap.Any("duration", data[1]),
143+
zap.Any("rows", data[2]),
144+
zap.Any("sql", data[3]),
145+
)
146+
}

0 commit comments

Comments
 (0)