You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GORM查询已处理ErrRecordNotFound仍输出记录未找到日志的原因

问题原因及解决方案

这事儿我遇过不少,其实问题出在GORM的默认日志机制和你代码里的错误处理是两个独立的环节——你处理的是业务逻辑层面的错误,但GORM本身的日志系统还是会把这条SQL的执行详情打出来,哪怕你已经捕获了ErrRecordNotFound。

具体原因

GORM默认的日志级别是Info,这个级别会记录所有SQL语句的执行情况,包括查询后返回"record not found"的结果。你的代码只是在业务逻辑里判断了这个错误并做了分支处理,但并没有告诉GORM不要把这条SQL执行日志输出到控制台。这条日志本质上是框架的SQL执行记录,不是你业务代码抛出的未处理错误,所以即便你捕获了错误,它还是会被打印出来。

解决办法

有两种常见的方式可以搞定这个问题:

1. 调整GORM的日志级别

把日志级别调高到Warn或者Error,这样只有警告或错误级别的日志才会被输出,而"record not found"属于Info级别的SQL执行日志,就不会再显示了。

示例代码:

// 初始化DB时配置
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
    Logger: logger.Default.LogMode(logger.Warn),
})

// 如果是已存在的DB实例,也可以通过Session修改
db = db.Session(&gorm.Session{Logger: db.Logger.LogMode(logger.Warn)})

2. 自定义Logger过滤特定日志

如果你不想降低整体日志级别,只想过滤掉"record not found"这条信息,可以自定义一个Logger来做拦截:

import (
    "context"
    "strings"
    "gorm.io/gorm/logger"
)

type recordNotFoundFilterLogger struct {
    logger.Interface
}

func (l recordNotFoundFilterLogger) Info(ctx context.Context, msg string, data ...interface{}) {
    // 检查日志内容,如果包含"record not found"就跳过输出
    if strings.Contains(msg, "record not found") {
        return
    }
    // 其他正常日志继续输出
    l.Interface.Info(ctx, msg, data...)
}

// 使用这个自定义Logger
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
    Logger: recordNotFoundFilterLogger{logger.Default},
})

补充说明

你的业务逻辑处理是完全没问题的,程序功能正常也验证了这一点——只是框架默认的日志输出让控制台多了这条信息,调整日志配置就能完美解决啦。

内容的提问来源于stack exchange,提问作者naneri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 08:08:13