linux

Golang日志中如何记录SQL查询

小樊
47
2025-07-06 08:04:10
栏目: 云计算

在Golang中,我们通常使用第三方日志库来记录日志,例如logrus、zap等。为了记录SQL查询,我们可以在执行SQL查询之前和之后记录相关信息。以下是一个使用logrus库记录SQL查询的示例:

首先,确保已经安装了logrus库:

go get github.com/sirupsen/logrus

然后,创建一个简单的Go程序,如下所示:

package main

import (
	"database/sql"
	"fmt"
	"github.com/sirupsen/logrus"
	_ "github.com/go-sql-driver/mysql"
)

func main() {
	// 初始化logrus
	logrus.SetFormatter(&logrus.TextFormatter{
		FullTimestamp: true,
	})

	// 连接数据库
	db, err := sql.Open("mysql", "username:password@tcp(localhost:3306)/dbname")
	if err != nil {
		logrus.Fatal(err)
	}
	defer db.Close()

	// 查询SQL
	sql := "SELECT * FROM users WHERE age > ?"
	age := 18

	// 记录SQL查询
	logrus.WithFields(logrus.Fields{
		"sql": sql,
		"params": []interface{}{age},
	}).Info("Executing SQL query")

	// 执行SQL查询
	rows, err := db.Query(sql, age)
	if err != nil {
		logrus.WithFields(logrus.Fields{
			"error": err,
		}).Error("Failed to execute SQL query")
		return
	}
	defer rows.Close()

	// 处理查询结果
	for rows.Next() {
		var id int
		var name string
		var userAge int
		err = rows.Scan(&id, &name, &userAge)
		if err != nil {
			logrus.WithFields(logrus.Fields{
				"error": err,
			}).Error("Failed to scan row")
			continue
		}
		logrus.WithFields(logrus.Fields{
			"id":   id,
			"name": name,
			"age":  userAge,
		}).Info("Row data")
	}

	// 检查查询过程中是否有错误
	if err = rows.Err(); err != nil {
		logrus.WithFields(logrus.Fields{
			"error": err,
		}).Error("Error occurred during row iteration")
	}
}

在这个示例中,我们使用logrus库记录了SQL查询及其参数。在执行查询之前,我们使用logrus.WithFields记录了SQL语句和参数。在执行查询之后,我们处理查询结果并记录每一行的数据。

注意:在实际项目中,为了保护敏感信息,不建议将完整的SQL语句和参数记录到日志中。可以根据需要记录部分信息或者使用脱敏处理。

0
看了该问题的人还看了