• GORM 中SQL、慢SQL打印日志传递 trace ID, Kratos框架输出日志trace id


    实现 gorm.io/gorm/logger 下的函数⬇️

    // gorm 源码
    type Interface interface {  
       LogMode(LogLevel) Interface  
       Info(context.Context, string, ...interface{})  
       Warn(context.Context, string, ...interface{})  
       Error(context.Context, string, ...interface{})  
       Trace(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error)  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    以下为自定义的重写实现,主要函数Trace

    package log  
      
    import (  
       "context"  
       "time"  
       "github.com/go-kratos/kratos/v2/log"
       "gorm.io/gorm/logger"
    )  
      
    type GormLogger struct {  
       SlowThreshold time.Duration  
    }  
      
    func NewGormLogger() *GormLogger {  
       return &GormLogger{  
          SlowThreshold: 200 * time.Millisecond, // 一般超过200毫秒就算慢查所以不使用配置进行更改  
       }  
    }  
      
    var _ logger.Interface = (*GormLogger)(nil)  
      
    func (l *GormLogger) LogMode(lev logger.LogLevel) logger.Interface {  
       return &GormLogger{}  
    }  
    func (l *GormLogger) Info(ctx context.Context, msg string, data ...interface{}) {  
       log.Context(ctx).Infof(msg, data)  
    }  
    func (l *GormLogger) Warn(ctx context.Context, msg string, data ...interface{}) {  
       log.Context(ctx).Errorf(msg, data)  
    }  
    func (l *GormLogger) Error(ctx context.Context, msg string, data ...interface{}) {  
       log.Context(ctx).Errorf(msg, data)  
    }  
    func (l *GormLogger) Trace(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) {  
       // 获取运行时间  
       elapsed := time.Since(begin)  
       // 获取 SQL 语句和返回条数  
       sql, rows := fc()  
       // Gorm 错误时打印
       if err != nil {  
          log.Context(ctx).Errorf("SQL ERROR, | sql=%v, rows=%v, elapsed=%v", sql, rows, elapsed)  
       }  
       // 慢查询日志  
       if l.SlowThreshold != 0 && elapsed > l.SlowThreshold {  
          log.Context(ctx).Warn("Database Slow Log, | sql=%v, rows=%v, elapsed=%v", sql, rows, elapsed)  
       }  
      
    }
    
    • 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

    这里我使用的log组件是kratos框架的log组件,设置好zap后注入为全局log

    GORM创建连接的地方注入我们重写后的自定义Logger

    db, err := gorm.Open(mysql.Open(cfg.Dsn()), &gorm.Config{  
       QueryFields: true,    
       Logger: logdef.NewGormLogger(),  // 注入
    })
    
    • 1
    • 2
    • 3
    • 4

    最后,在查询的地方,带上withContext即可

    func (ud *userDao) AddOne(c context.Context, user *model.User) (userId int64, err error) {  
       err = db.GetConn().WithContext(c).Create(user).Error  
       if err != nil {  
          log.Context(c).Errorf("AddOne fail|err=%+v", err)  
          return  
       }  
       return user.Id, nil  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    某城商行双活建设方案设计与实施经验分享
    C语言实现三子棋小游戏(源码+教程)
    新学期、新目标、迎接新的自己
    详解:生产线平衡改善的四大方法与八大步骤!
    代码随想录48——动态规划:198打家劫舍、213打家劫舍II、337打家劫舍III
    电子商务平台市场动向的数据分析平台:阿里商品指数,包括淘宝采购指数,淘宝供应指数,1688供应指数。
    HTML元素大全(2)-表单
    【Prometheus】Prometheus+Grafana部署
    ubuntu 22.04 安装 minikube 和 istio
    mysql内连接与外连接详解
  • 原文地址:https://blog.csdn.net/w_monster/article/details/133278799