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
📝 发现内容有误?点击此处直接编辑