全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-21 8 分钟 ✍️ juanwangdev

GORM 慢查询监控

通过配置慢查询日志和使用 Trace 接口可分析 SQL 执行性能,本文介绍监控配置与使用方法。

慢查询日志配置

Go
import (
    "gorm.io/gorm/logger"
    "log"
    "os"
    "time"
)

// 配置 200ms 慢查询阈值
slowLogger := logger.New(
    log.New(os.Stdout, "\r\n", log.LstdFlags),
    logger.Config{
        SlowThreshold: 200 * time.Millisecond,
        LogLevel:      logger.Warn,
    },
)

超过阈值的查询将自动输出警告:

Go
[warning] slow SQL: 350ms
SELECT * FROM users WHERE status = 'active'

Trace 方法分析性能

GORM Callback 支持使用 Trace 获取执行信息:

Go
import "gorm.io/gorm"

db.Callback().Query().After("gorm:query").Register("trace", func(db *gorm.DB) {
    if db.Error == nil && db.Dialector.Explain(db.Statement.SQL.String(), db.Statement) != "" {
        duration := db.InstanceGet("trace_start").(time.Time)
        elapsed := time.Since(duration)
        
        if elapsed > 200*time.Millisecond {
            log.Printf("[SLOW] %s took %v", db.Statement.SQL.String(), elapsed)
        }
    }
})

使用 Session 监控

Go
// 单次查询开启 Trace
var user User
db.Session(&gorm.Session{
    Logger: db.Logger.LogMode(logger.Info),
}).First(&user, 1)

// 全局开启 Trace
db = db.Session(&gorm.Session{
    Logger: logger.New(
        log.New(os.Stdout, "\r\n", log.LstdFlags),
        logger.Config{
            SlowThreshold: 100 * time.Millisecond,
            LogLevel:      logger.Warn,
        },
    ),
})

监控指标对照

指标说明
SQL 语句执行的完整 SQL
耗时执行时间(含网络传输)
影响行数返回或影响的记录数
错误信息执行失败的错误

实践建议

text
// 1. 生产环境设置合理的慢查询阈值
// 2. 定期收集慢查询日志
// 3. 使用 EXPLAIN 分析慢查询
// 4. 关注高频慢查询并优化索引

db.Exec("EXPLAIN SELECT * FROM users WHERE email = ?", "test@example.com")

慢查询阈值根据业务场景调整,一般建议 100ms~500ms。

要点总结

  • 配置 SlowThreshold 设置慢查询阈值
  • 超过阈值的查询自动输出警告日志
  • 使用 Callback Trace 方法可获取详细执行信息
  • 生产环境定期收集并分析慢查询日志

文章存放路径:D:\git2\jwdev\articles\GORM\进阶\错误处理与日志\慢查询监控.md

📝 发现内容有误?点击此处直接编辑

← 上一篇 GORM 查询钩子实现
下一篇 → GORM 数据库错误处理
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库