From e4ad2d2b98079c0c5f48df1ab3abb9e480183a82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BE=B7=E6=BB=A1?= Date: Mon, 1 Mar 2021 22:44:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0gorm=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=20-=20=E5=BE=85=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 2 + go.sum | 10 +++ logger/wrapper/gorm_v2.go | 148 +++++++++++++++++++++++++++++++++ middleware/redis/redis_test.go | 2 +- 4 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 logger/wrapper/gorm_v2.go diff --git a/go.mod b/go.mod index 60510b2..c38de97 100644 --- a/go.mod +++ b/go.mod @@ -11,4 +11,6 @@ require ( github.com/spaolacci/murmur3 v1.1.0 github.com/stretchr/testify v1.7.0 go.uber.org/zap v1.16.0 + gorm.io/driver/mysql v1.0.4 + gorm.io/gorm v1.20.12 ) diff --git a/go.sum b/go.sum index 943bf14..7822e72 100644 --- a/go.sum +++ b/go.sum @@ -23,6 +23,8 @@ github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GO github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= github.com/go-redis/redis/v8 v8.6.0 h1:swqbqOrxaPztsj2Hf1p94M3YAgl7hYEpcw21z299hh8= github.com/go-redis/redis/v8 v8.6.0/go.mod h1:DQ9q4Rk2HtwkrwVrdgmphoOQDMfpvcd/nHEwRsicg8s= +github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= @@ -40,6 +42,10 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.1 h1:g39TucaRWyV3dwDO++eEc6qf8TVIQ/Da48WmqjZ3i7E= +github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -162,4 +168,8 @@ gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.0.4 h1:TATTzt+kR+IV0+h3iUB3dHUe8omCvQ0rOkmfCsUBohk= +gorm.io/driver/mysql v1.0.4/go.mod h1:MEgp8tk2n60cSBCq5iTcPDw3ns8Gs+zOva9EUhkknTs= +gorm.io/gorm v1.20.12 h1:ebZ5KrSHzet+sqOCVdH9mTjW91L298nX3v5lVxAzSUY= +gorm.io/gorm v1.20.12/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= diff --git a/logger/wrapper/gorm_v2.go b/logger/wrapper/gorm_v2.go new file mode 100644 index 0000000..dcdd1b5 --- /dev/null +++ b/logger/wrapper/gorm_v2.go @@ -0,0 +1,148 @@ +// Package wrapper... +// +// Description : gorm v2 版本接口实现 +// +// Author : go_developer@163.com<张德满> +// +// Date : 2021-03-01 9:52 下午 +package wrapper + +import ( + "context" + "fmt" + "time" + + "gorm.io/gorm" + + "go.uber.org/zap/zapcore" + + "go.uber.org/zap" + + logger2 "github.com/go-developer/gopkg/logger" + "gorm.io/gorm/logger" +) + +// NewGormV2 获取日志实例 +// +// Author : go_developer@163.com<张德满> +// +// Date : 9:56 下午 2021/3/1 +func NewGormV2(loggerLevel zapcore.Level, consoleOutput bool, encoder zapcore.Encoder, splitConfig *logger2.RotateLogConfig, traceIDField string) (logger.Interface, error) { + logInstance, err := logger2.NewLogger(loggerLevel, consoleOutput, encoder, splitConfig) + if nil != err { + return nil, err + } + return &Gorm{ + instance: logInstance, + }, nil +} + +// Gorm v2 版本库日志实现 +// +// Author : go_developer@163.com<张德满> +// +// Date : 9:55 下午 2021/3/1 +type Gorm struct { + instance *zap.Logger // 日志实例 + traceIDField string // 串联请求上下文的的ID + flag string // 数据库标识 +} + +// LogMode ... +// +// Author : go_developer@163.com<张德满> +// +// Date : 10:08 下午 2021/3/1 +func (g *Gorm) LogMode(level logger.LogLevel) logger.Interface { + return g +} + +// Info 日志 +// +// Author : go_developer@163.com<张德满> +// +// Date : 10:18 下午 2021/3/1 +func (g *Gorm) Info(ctx context.Context, s string, i ...interface{}) { + g.instance.Info( + "Info日志", + zap.String(g.traceIDField, g.getTraceID(ctx)), + zap.String("db_flag", g.flag), + zap.String("message", fmt.Sprintf(s, i...)), + ) +} + +// Warn ... +// +// Author : go_developer@163.com<张德满> +// +// Date : 10:16 下午 2021/3/1 +func (g *Gorm) Warn(ctx context.Context, s string, i ...interface{}) { + g.instance.Warn( + "SQL执行产生Warning", + zap.String(g.traceIDField, g.getTraceID(ctx)), + zap.String("db_flag", g.flag), + zap.String("message", fmt.Sprintf(s, i...)), + ) +} + +// Error 日志 +// +// Author : go_developer@163.com<张德满> +// +// Date : 10:18 下午 2021/3/1 +func (g *Gorm) Error(ctx context.Context, s string, i ...interface{}) { + g.instance.Warn( + "SQL执行产生Error", + zap.String(g.traceIDField, g.getTraceID(ctx)), + zap.String("db_flag", g.flag), + zap.String("message", fmt.Sprintf(s, i...)), + ) +} + +// Trace Trace 记录 +// +// Author : go_developer@163.com<张德满> +// +// Date : 10:19 下午 2021/3/1 +func (g *Gorm) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) { + start := begin.UnixNano() + end := time.Now().UnixNano() + sql := "" + affectRows := int64(0) + if nil != fc { + sql, affectRows = fc() + } + + g.instance.Info( + "SQL执行记录", + zap.String(g.traceIDField, g.getTraceID(ctx)), + zap.String("db_flag", g.flag), + zap.Int64("begin_time", start), + zap.Int64("finish_time", end), + zap.String("used_time", fmt.Sprintf("%fms", float64(end-start)/1e6)), + zap.String("sql", sql), + zap.Int64("affect_rows", affectRows), + zap.Error(err), + ) + return +} + +// getTraceID 获取traceID +// +// Author : go_developer@163.com<张德满> +// +// Date : 10:11 下午 2021/3/1 +func (g *Gorm) getTraceID(ctx context.Context) string { + return fmt.Sprintf("%v", ctx.Value(g.traceIDField)) +} + +// GetGormSQL 获取tracefn +// +// Author : go_developer@163.com<张德满> +// +// Date : 10:38 下午 2021/3/1 +func GetGormSQL(dbClient *gorm.DB) func() (string, int64) { + return func() (string, int64) { + return dbClient.Dialector.Explain(dbClient.Statement.SQL.String(), dbClient.Statement.Vars...), dbClient.RowsAffected + } +} diff --git a/middleware/redis/redis_test.go b/middleware/redis/redis_test.go index 3d5f784..070e52e 100644 --- a/middleware/redis/redis_test.go +++ b/middleware/redis/redis_test.go @@ -23,7 +23,7 @@ import ( // Date : 10:22 下午 2021/2/27 func TestCommandProxy(t *testing.T) { instance, err := NewClient(map[string]Options{ - "test_redis": Options{ + "test_redis": { Conf: &redisInstance.Options{ Addr: "127.0.0.1:6379", },