如何屏蔽GORM个别sql的日志
背景:
gorm开启了日志,有个表存储大的二进制数据,导致日志文件很大,而且二进制导致乱码。
需求:
屏蔽这个表的sql日志,不要影响其他表的sql日志。
实验:
gorm_log.go
package mainimport ("database/sql""fmt""log""net/url""gorm.io/gorm/logger""time""gorm.io/driver/mysql""gorm.io/gorm"
)type Params struct {Id int64 `gorm:"id" json:"id"`Key string `gorm:"key" json:"key"`Value string `gorm:"value" json:"value"`
}func (Params) TableName() string {return "params"
}func main() {encodedPassword := url.QueryEscape("mypass")dsn := "root:" + encodedPassword + "@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"//fmt.Println(dsn)newLogger := logger.New(log.New(log.Writer(), "\r\n", log.LstdFlags), // io writerlogger.Config{SlowThreshold: time.Second, // 慢SQL阈值LogLevel: logger.Info, // 日志级别IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound(记录未找到)错误Colorful: true, // 启用彩色打印},)gormDB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: newLogger,})sqlDB, err := gormDB.DB()if err != nil {log.Fatal(err)}// 常规的gorm用法var params ParamssqlResult := gormDB.First(¶ms, 1)if sqlResult.Error != nil {log.Fatal(sqlResult.Error)}fmt.Println(params)// gorm使用原生SQL查询var result struct {Count int}err = sqlDB.QueryRow("SELECT COUNT(*) as count FROM params").Scan(&result.Count)if err != nil {log.Fatal(err)}fmt.Printf("count: %d\n", result.Count)// 使用真正的原生SQL(不依赖GORM)useNativeSQL(sqlDB)
}func useNativeSQL(db *sql.DB) {rows, err := db.Query("SELECT `key`, value FROM params limit 3")if err != nil {log.Fatal(err)}defer rows.Close()for rows.Next() {var key, value stringerr = rows.Scan(&key, &value)if err != nil {log.Fatal(err)}fmt.Printf("key: %s, value: %s\n", key, value)}if err = rows.Err(); err != nil {log.Fatal(err)}
}
运行:
go mod init gormtest
go mod tidy
go run gorm_log.go
输出:
结论:
1、gorm常规用法会有日志。
2、通过gorm执行原生sql不会有日志。
3、从gorm获取数据库连接,然后使用golang的原生sql写法不会有日志。
--end--