[GO] gin 框架gorm下使用logrus记录sql语句

本文介绍如何利用Logrus将Gorm框架执行的SQL语句记录到指定的日志文件中,包括配置Logrus及整合Gorm的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用gin gorm时 , 默认sql语句是打印在终端的 ,想要记录到文件中 , 可以使用logrus来记录到文件

先把logrus的一些配置做好

package tools

import (
    "fmt"
    "github.com/gin-gonic/gin"
    "github.com/sirupsen/logrus"
    "os"
    "path"
    "time"
)

func Logger() *logrus.Logger {
    now := time.Now()
    logFilePath := ""
    if dir, err := os.Getwd(); err == nil {
        logFilePath = dir + "/logs/"
    }
    if err := os.MkdirAll(logFilePath, 0777); err != nil {
        fmt.Println(err.Error())
    }
    logFileName := now.Format("2006-01-02") + ".log"
    //日志文件
    fileName := path.Join(logFilePath, logFileName)
    if _, err := os.Stat(fileName); err != nil {
        if _, err := os.Create(fileName); err != nil {
            fmt.Println(err.Error())
        }
    }
    //写入文件
    src, err := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY, os.ModeAppend)
    if err != nil {
        fmt.Println("err", err)
    }

    //实例化
    logger := logrus.New()

    //设置输出
    logger.Out = src

    //设置日志级别
    logger.SetLevel(logrus.DebugLevel)

    //设置日志格式
    logger.SetFormatter(&logrus.TextFormatter{
        TimestampFormat: "2006-01-02 15:04:05",
    })
    return logger
}

在初始化gorm的地方设置logger , 把上面的logger设置进去就可以了

    DB, err = gorm.Open("mysql", dsn)
    if err != nil {
        panic("数据库连接失败!")
    }
    DB.SingularTable(true)
    DB.LogMode(true)
    DB.SetLogger(tools.Logger())
    DB.DB().SetMaxIdleConns(10)
    DB.DB().SetMaxOpenConns(100)

文件中记录的sql

### Go Gin框架GORM框架的集成及使用教程 #### 项目初始化 创建一个新的Go模块并安装必要的依赖包。通过命令行工具来设置环境,确保所有必需组件都已就绪。 ```bash go mod init myproject go get -u github.com/gin-gonic/gin go get -u gorm.io/gorm go get -u gorm.io/driver/mysql ``` 这些命令分别用于初始化新的Go模块、获取Gin框架及其所需的支持库以及获取GORM ORM库和支持MySQL数据库的操作[^4]。 #### 配置数据库连接 为了使应用程序能够访问数据库,在`main.go`文件中添加如下代码片段: ```go package main import ( "gorm.io/driver/mysql" "gorm.io/gorm" ) func InitDB() *gorm.DB { dsn := "username:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic("failed to connect database") } return db } ``` 此函数负责打开到指定MySQL实例的数据源名称(DSN),并通过它建立一个持久化的数据库会话对象[^3]。 #### 定义数据模型 接下来定义一些结构体表示要存储于关系型数据库中的实体类。这里以用户表为例展示基本语法: ```go type User struct { ID uint `json:"id"` Name string `json:"name" binding:"required,min=3,max=50"` Email string `json:"email" binding:"required,email"` Password string `json:"-" binding:"required,min=6"` // 不返回给客户端 } // 自动迁移模式 db.AutoMigrate(&User{}) ``` 这段代码展示了如何声明一个简单的用户记录映射至SQL表格的方式,并调用了自动迁移功能使得程序可以根据定义自动生成相应的DDL语句[^2]。 #### 实现RESTful API接口 利用Gin路由机制快速构建HTTP服务端点。下面是一个完整的例子说明怎样实现增删改查(CRUD)操作: ```go router.POST("/users", func(c *gin.Context) { var user User c.BindJSON(&user) result := db.Create(&user) if result.Error != nil { c.JSON(http.StatusBadRequest, gin.H{"error":result.Error}) return } c.JSON(http.StatusOK, user) }) router.GET("/users/:id", func(c *gin.Context){ id := c.Param("id") var user User if err := db.First(&user,id).Error;err!=nil{ c.AbortWithStatus(http.StatusNotFound) return }else{ c.JSON(http.StatusOK,user) } }) router.PUT("/users/:id", func(c *gin.Context){ id:=c.Param("id") var updateUser=User{} if err:=c.ShouldBindJSON(&updateUser);err!=nil{ c.JSON(http.StatusBadRequest,err) return } tx:=db.Model(&User{}).Where("id=?",id).Updates(updateUser) if tx.RowsAffected==0{ c.JSON(http.StatusNotFound,"not found") return } c.JSON(http.StatusOK,map[string]interface{}{ "message":"success", "rows_affected":tx.RowsAffected, }) }) router.DELETE("/users/:id", func(c *gin.Context){ id:=c.Param("id") tx:=db.Delete(&User{},id) if tx.RowsAffected==0{ c.JSON(http.StatusNotFound,nil) return } c.JSON(http.StatusOK,gimn.H{"message":"deleted"}) }) ``` 上述代码实现了四个标准路径处理器,它们对应着不同的HTTP请求方法(GET/POST/PUT/DELETE)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值