如何屏蔽GORM个别sql的日志

背景:

gorm开启了日志,有个表存储大的二进制数据,导致日志文件很大,而且二进制导致乱码。

需求:

屏蔽这个表的sql日志,不要影响其他表的sql日志。

实验:

gorm_log.go

Go 复制代码
package main

import (
	"context"
	"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("mypassword")
	dsn := "root:" + encodedPassword + "@tcp(127.0.0.1:3306)/mydbname?charset=utf8mb4&parseTime=True&loc=Local"
	//fmt.Println(dsn)
	newLogger := logger.New(
		log.New(log.Writer(), "\r\n", log.LstdFlags), // io writer
		logger.Config{
			SlowThreshold:             time.Second, // 慢SQL阈值
			LogLevel:                  logger.Info, // 日志级别
			IgnoreRecordNotFoundError: true,        // 忽略ErrRecordNotFound(记录未找到)错误
			Colorful:                  true,        // 启用彩色打印
		},
	)
	gormDB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
		Logger: newLogger,
	})
	if err != nil {
		log.Fatal(err)
	}
	sqlDB, err := gormDB.DB()
	if err != nil {
		log.Fatal(err)
	}

	// 常规的gorm用法
	fmt.Println("--- gorm start ---")
	var params Params
	sqlResult := gormDB.First(&params, 1)
	if sqlResult.Error != nil {
		log.Fatal(sqlResult.Error)
	}
	fmt.Println(params)
	fmt.Println("--- gorm end ---")

	// gorm.DB使用原生SQL查询
	fmt.Println("--- gorm.DB with raw sql start ---")
	var result struct {
		Count int
	}
	err = gormDB.Raw("SELECT COUNT(*) as count FROM params").Scan(&result.Count).Error
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("count: %d\n", result.Count)
	fmt.Println("--- gorm.DB with raw sql end ---")

	// sql.DB使用原生SQL查询
	fmt.Println("--- sql.DB with raw sql start ---")
	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)
	fmt.Println("--- sql.DB with raw sql end ---")

	// 使用真正的原生SQL(不依赖GORM)
	fmt.Println("--- golang raw sql start ---")
	useNativeSQL(sqlDB)
	fmt.Println("--- golang raw sql end ---")

	// 直接使用日志方法自己打印日志
	fmt.Println("--- gorm log start ---")
	gormDB.Logger.Info(context.TODO(), "gorm log is here")
	fmt.Println("--- gorm log end ---")
}

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 string
		err = 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)
	}
}

运行:

bash 复制代码
go mod init gormtest
go mod tidy
go run gorm_log.go

输出:

结论:

1、gorm常规用法和通过grom.DB的原生用法都会有日志。

2、通过gorm获取sql.DB然后执行原生sql不会有日志。

3、通过gorm获取sql.DB然后使用golang的原生sql写法不会有日志。

4、通过gormDB.Logger可以自己打印出类似形式的日志。

--end--

相关推荐
TDengine (老段)5 小时前
TDengine 数字函数 RADIANS 用户手册
大数据·数据库·sql·物联网·时序数据库·tdengine·涛思数据
小蒜学长5 小时前
springboot基于JAVA的二手书籍交易系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
野犬寒鸦5 小时前
从零起步学习MySQL || 第七章:初识索引底层运用及性能优化(结合底层数据结构讲解)
java·数据库·后端·mysql·oracle
6极地诈唬6 小时前
【sqlite】WAL初探
数据库·sqlite
PieroPc6 小时前
用Python Streamlit sqlite3 写一个简单博客
数据库·python·sqlite
啊森要自信6 小时前
【MySQL 数据库】使用C语言操作MySQL
linux·c语言·开发语言·数据库·mysql
你想考研啊6 小时前
二、redis集群部署(3主3从)
数据库·redis·缓存
冉冰学姐7 小时前
SSM考试管理z2zvx(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·ssm 框架·学生信息管理
友友马7 小时前
『 QT 』信号-槽 补充: Qt信号槽断开连接与Lambda槽技巧
开发语言·数据库·qt