提交 bfc9c14e 编写于 作者: m0_50812349's avatar m0_50812349

优化gorm的自定义logger代码, 升级gorm的版本为1.20.9, Makefile 添加goproxy代理

上级 a28c6fc1
.PHONY: all build run gotool clean help .PHONY: all build run gotool clean help
BINARY="server" BINARY="gin-vue-admin"
GVA = "gva" GVA = "gva"
all: check gva initdb run all: check gva initdb run
gva: gva:
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct
go build -o ${GVA} cmd/main.go go build -o ${GVA} cmd/main.go
initdb: initdb:
......
...@@ -54,7 +54,7 @@ require ( ...@@ -54,7 +54,7 @@ require (
gopkg.in/ini.v1 v1.55.0 // indirect gopkg.in/ini.v1 v1.55.0 // indirect
gopkg.in/yaml.v2 v2.3.0 // indirect gopkg.in/yaml.v2 v2.3.0 // indirect
gorm.io/driver/mysql v0.3.0 gorm.io/driver/mysql v0.3.0
gorm.io/gorm v1.20.5 gorm.io/gorm v1.20.9
) )
replace github.com/casbin/gorm-adapter/v3 => github.com/casbin/gorm-adapter/v3 v3.0.2 replace github.com/casbin/gorm-adapter/v3 => github.com/casbin/gorm-adapter/v3 v3.0.2
\ No newline at end of file
...@@ -2,6 +2,7 @@ package initialize ...@@ -2,6 +2,7 @@ package initialize
import ( import (
"gin-vue-admin/global" "gin-vue-admin/global"
"gin-vue-admin/initialize/internal"
"gin-vue-admin/model" "gin-vue-admin/model"
"go.uber.org/zap" "go.uber.org/zap"
"gorm.io/driver/mysql" "gorm.io/driver/mysql"
...@@ -97,38 +98,24 @@ func GormMysql() *gorm.DB { ...@@ -97,38 +98,24 @@ func GormMysql() *gorm.DB {
//@return: *gorm.Config //@return: *gorm.Config
func gormConfig(mod bool) *gorm.Config { func gormConfig(mod bool) *gorm.Config {
var config = &gorm.Config{DisableForeignKeyConstraintWhenMigrating: true}
switch global.GVA_CONFIG.Mysql.LogZap { switch global.GVA_CONFIG.Mysql.LogZap {
case "Silent": case "silent", "Silent":
return &gorm.Config{ config.Logger = internal.Default.LogMode(logger.Silent)
Logger: Default.LogMode(logger.Silent), case "error", "Error":
DisableForeignKeyConstraintWhenMigrating: true, config.Logger = internal.Default.LogMode(logger.Error)
} case "warn", "Warn":
case "Error": config.Logger = internal.Default.LogMode(logger.Warn)
return &gorm.Config{ case "info", "Info":
Logger: Default.LogMode(logger.Error), config.Logger = internal.Default.LogMode(logger.Info)
DisableForeignKeyConstraintWhenMigrating: true, case "zap", "Zap":
} config.Logger = internal.Default.LogMode(logger.Info)
case "Warn":
return &gorm.Config{
Logger: Default.LogMode(logger.Warn),
DisableForeignKeyConstraintWhenMigrating: true,
}
case "Info":
return &gorm.Config{
Logger: Default.LogMode(logger.Info),
DisableForeignKeyConstraintWhenMigrating: true,
}
default: default:
if mod { if mod {
return &gorm.Config{ config.Logger = internal.Default.LogMode(logger.Info)
Logger: logger.Default.LogMode(logger.Info), break
DisableForeignKeyConstraintWhenMigrating: true,
}
} else {
return &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
DisableForeignKeyConstraintWhenMigrating: true,
}
} }
config.Logger = internal.Default.LogMode(logger.Silent)
} }
return config
} }
package initialize package internal
import ( import (
"context" "context"
...@@ -13,9 +13,20 @@ import ( ...@@ -13,9 +13,20 @@ import (
"time" "time"
) )
// writer log writer interface
type writer interface {
Printf(string, ...interface{})
}
type config struct {
SlowThreshold time.Duration
Colorful bool
LogLevel logger.LogLevel
}
var ( var (
Discard = New(log.New(ioutil.Discard, "", log.LstdFlags), log.New(ioutil.Discard, "", log.LstdFlags), GormConfig{}) Discard = New(log.New(ioutil.Discard, "", log.LstdFlags), config{})
Default = New(log.New(os.Stdout, "\r\n", log.LstdFlags), log.New(os.Stdout, "\r\n", log.LstdFlags), GormConfig{ Default = New(log.New(os.Stdout, "\r\n", log.LstdFlags), config{
SlowThreshold: 200 * time.Millisecond, SlowThreshold: 200 * time.Millisecond,
LogLevel: logger.Warn, LogLevel: logger.Warn,
Colorful: true, Colorful: true,
...@@ -23,15 +34,7 @@ var ( ...@@ -23,15 +34,7 @@ var (
Recorder = traceRecorder{Interface: Default, BeginAt: time.Now()} Recorder = traceRecorder{Interface: Default, BeginAt: time.Now()}
) )
type traceRecorder struct { func New(writer writer, config config) logger.Interface {
logger.Interface
BeginAt time.Time
SQL string
RowsAffected int64
Err error
}
func New(writer Writer, gormWriter logger.Writer, config GormConfig) logger.Interface {
var ( var (
infoStr = "%s\n[info] " infoStr = "%s\n[info] "
warnStr = "%s\n[warn] " warnStr = "%s\n[warn] "
...@@ -50,10 +53,9 @@ func New(writer Writer, gormWriter logger.Writer, config GormConfig) logger.Inte ...@@ -50,10 +53,9 @@ func New(writer Writer, gormWriter logger.Writer, config GormConfig) logger.Inte
traceErrStr = logger.RedBold + "%s " + logger.MagentaBold + "%s\n" + logger.Reset + logger.Yellow + "[%.3fms] " + logger.BlueBold + "[rows:%v]" + logger.Reset + " %s" traceErrStr = logger.RedBold + "%s " + logger.MagentaBold + "%s\n" + logger.Reset + logger.Yellow + "[%.3fms] " + logger.BlueBold + "[rows:%v]" + logger.Reset + " %s"
} }
return &GormLogger{ return &customLogger{
Writer: writer, writer: writer,
gormWriter: gormWriter, config: config,
GormConfig: config,
infoStr: infoStr, infoStr: infoStr,
warnStr: warnStr, warnStr: warnStr,
errStr: errStr, errStr: errStr,
...@@ -63,81 +65,74 @@ func New(writer Writer, gormWriter logger.Writer, config GormConfig) logger.Inte ...@@ -63,81 +65,74 @@ func New(writer Writer, gormWriter logger.Writer, config GormConfig) logger.Inte
} }
} }
// Writer log writer interface type customLogger struct {
type Writer interface { writer
Printf(string, ...interface{}) config
}
type GormConfig struct {
SlowThreshold time.Duration
Colorful bool
LogLevel logger.LogLevel
}
type GormLogger struct {
Writer
gormWriter logger.Writer
GormConfig
infoStr, warnStr, errStr string infoStr, warnStr, errStr string
traceStr, traceErrStr, traceWarnStr string traceStr, traceErrStr, traceWarnStr string
} }
func (g *GormLogger) LogMode(level logger.LogLevel) logger.Interface { // LogMode log mode
newLogger := *g func (c *customLogger) LogMode(level logger.LogLevel) logger.Interface {
newLogger := *c
newLogger.LogLevel = level newLogger.LogLevel = level
return &newLogger return &newLogger
} }
func (g *GormLogger) Info(ctx context.Context, message string, data ...interface{}) { // Info print info
if g.LogLevel >= logger.Info { func (c *customLogger) Info(ctx context.Context, message string, data ...interface{}) {
g.Printf(g.infoStr+message, append([]interface{}{utils.FileWithLineNum()}, data...)...) if c.LogLevel >= logger.Info {
c.Printf(c.infoStr+message, append([]interface{}{utils.FileWithLineNum()}, data...)...)
} }
} }
func (g *GormLogger) Warn(ctx context.Context, message string, data ...interface{}) { // Warn print warn messages
if g.LogLevel >= logger.Warn { func (c *customLogger) Warn(ctx context.Context, message string, data ...interface{}) {
g.Printf(g.warnStr+message, append([]interface{}{utils.FileWithLineNum()}, data...)...) if c.LogLevel >= logger.Warn {
c.Printf(c.warnStr+message, append([]interface{}{utils.FileWithLineNum()}, data...)...)
} }
} }
func (g *GormLogger) Error(ctx context.Context, message string, data ...interface{}) { // Error print error messages
if g.LogLevel >= logger.Error { func (c *customLogger) Error(ctx context.Context, message string, data ...interface{}) {
g.Printf(g.errStr+message, append([]interface{}{utils.FileWithLineNum()}, data...)...) if c.LogLevel >= logger.Error {
c.Printf(c.errStr+message, append([]interface{}{utils.FileWithLineNum()}, data...)...)
} }
} }
func (g *GormLogger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) { // Trace print sql message
if g.LogLevel > 0 { func (c *customLogger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) {
if c.LogLevel > 0 {
elapsed := time.Since(begin) elapsed := time.Since(begin)
switch { switch {
case err != nil && g.LogLevel >= logger.Error: case err != nil && c.LogLevel >= logger.Error:
sql, rows := fc() sql, rows := fc()
if rows == -1 { if rows == -1 {
g.Printf(g.traceErrStr, utils.FileWithLineNum(), err, float64(elapsed.Nanoseconds())/1e6, "-", sql) c.Printf(c.traceErrStr, utils.FileWithLineNum(), err, float64(elapsed.Nanoseconds())/1e6, "-", sql)
} else { } else {
g.Printf(g.traceErrStr, utils.FileWithLineNum(), err, float64(elapsed.Nanoseconds())/1e6, rows, sql) c.Printf(c.traceErrStr, utils.FileWithLineNum(), err, float64(elapsed.Nanoseconds())/1e6, rows, sql)
} }
case elapsed > g.SlowThreshold && g.SlowThreshold != 0 && g.LogLevel >= logger.Warn: case elapsed > c.SlowThreshold && c.SlowThreshold != 0 && c.LogLevel >= logger.Warn:
sql, rows := fc() sql, rows := fc()
slowLog := fmt.Sprintf("SLOW SQL >= %v", g.SlowThreshold) slowLog := fmt.Sprintf("SLOW SQL >= %v", c.SlowThreshold)
if rows == -1 { if rows == -1 {
g.Printf(g.traceWarnStr, utils.FileWithLineNum(), slowLog, float64(elapsed.Nanoseconds())/1e6, "-", sql) c.Printf(c.traceWarnStr, utils.FileWithLineNum(), slowLog, float64(elapsed.Nanoseconds())/1e6, "-", sql)
} else { } else {
g.Printf(g.traceWarnStr, utils.FileWithLineNum(), slowLog, float64(elapsed.Nanoseconds())/1e6, rows, sql) c.Printf(c.traceWarnStr, utils.FileWithLineNum(), slowLog, float64(elapsed.Nanoseconds())/1e6, rows, sql)
} }
case g.LogLevel >= logger.Info: case c.LogLevel >= logger.Info:
sql, rows := fc() sql, rows := fc()
if rows == -1 { if rows == -1 {
g.Printf(g.traceStr, utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, "-", sql) c.Printf(c.traceStr, utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, "-", sql)
} else { } else {
g.Printf(g.traceStr, utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, rows, sql) c.Printf(c.traceStr, utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, rows, sql)
} }
} }
} }
} }
func (g *GormLogger) Printf(message string, data ...interface{}) { func (c *customLogger) Printf(message string, data ...interface{}) {
if global.GVA_CONFIG.Mysql.LogZap == "Info" && !global.GVA_CONFIG.Mysql.LogMode { if global.GVA_CONFIG.Mysql.LogZap != "" {
switch len(data) { switch len(data) {
case 0: case 0:
global.GVA_LOG.Info(message) global.GVA_LOG.Info(message)
...@@ -154,14 +149,34 @@ func (g *GormLogger) Printf(message string, data ...interface{}) { ...@@ -154,14 +149,34 @@ func (g *GormLogger) Printf(message string, data ...interface{}) {
} }
switch len(data) { switch len(data) {
case 0: case 0:
g.gormWriter.Printf(message, "") c.writer.Printf(message, "")
case 1: case 1:
g.gormWriter.Printf(message, data[0].(string)) c.writer.Printf(message, data[0])
case 2: case 2:
g.gormWriter.Printf(message, data[0].(string), data[1].(float64)) c.writer.Printf(message, data[0], data[1])
case 3: case 3:
g.gormWriter.Printf(message, data[0].(string), data[1].(float64), data[2].(string)) c.writer.Printf(message, data[0], data[1], data[2])
case 4: case 4:
g.gormWriter.Printf(message, data[0].(string), data[1].(float64), data[2].(string), data[3].(string)) c.writer.Printf(message, data[0], data[1], data[2], data[3])
case 5:
c.writer.Printf(message, data[0], data[1], data[2], data[3], data[4])
} }
} }
type traceRecorder struct {
logger.Interface
BeginAt time.Time
SQL string
RowsAffected int64
Err error
}
func (t traceRecorder) New() *traceRecorder {
return &traceRecorder{Interface: t.Interface, BeginAt: time.Now()}
}
func (t *traceRecorder) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) {
t.BeginAt = begin
t.SQL, t.RowsAffected = fc()
t.Err = err
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册