如何在 Go-Gorm 中禁用默认错误记录器
How to disable default error logger in Go-Gorm
我在 MySQL 中使用 GORM,我遇到并处理了错误 Error 1062: Duplicate entry
。问题是它仍然打印到控制台。
gym/models/auth.go:49
中的代码:
func AddAuth(username, password string) error {
passwordHash, err := auth.HashPassword(password, argon2Conf)
if err != nil {
return err
}
userAuth := Auth{
Username: username,
Password: passwordHash,
}
return db.Create(&userAuth).Error
}
我正在处理处理函数中的错误:
func SignUpHandler(c *gin.Context) {
var form user
if err := c.ShouldBind(&form); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
if err := models.AddAuth(form.Username, form.Password); err == nil {
c.JSON(http.StatusOK, gin.H{"status": "you are signed in"})
} else {
// I think I have handled the sql error here
c.JSON(http.StatusBadRequest, gin.H{"error": "sign in failed"})
}
}
当我发送 POST
请求时,错误得到了正确处理,我得到了 {"error": "sign in failed"}
的正确响应。但控制台仍然打印此错误消息:
(/...../gym/models/auth.go:49)
[2019-04-28 23:37:06] Error 1062: Duplicate entry '123123' for key 'username'
[GIN] 2019/04/28 - 23:37:06 | 400 | 136.690908ms | ::1 | POST /signup
我很困惑,因为我处理了这个错误,但它仍然被打印出来。如何防止此错误打印到错误日志中?还是我处理的错误正确?
更新:对于 gorm v2
:
使用 gorm.Config
中的 Logger
:
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
})
对于 gorm v1
:
使用 db.LogMode 关闭默认错误记录器。
LogMode set log mode, true
for detailed logs, false
for no log, default, will only print error logs.
db.LogMode(false)
应该能胜任!
我没有足够的声誉来发表评论,只是为了添加 ifnotak
的答案,您可以通过环境变量控制它来有条件地记录 sql。这在调试期间会很方便。
gormConfig := &gorm.Config{}
if !logSql {
// I use an env variable LOG_SQL to set logSql to either true or false.
gormConfig.Logger = logger.Default.LogMode(logger.Silent)
}
db, err := gorm.Open(dialector, gormConfig)
我在 MySQL 中使用 GORM,我遇到并处理了错误 Error 1062: Duplicate entry
。问题是它仍然打印到控制台。
gym/models/auth.go:49
中的代码:
func AddAuth(username, password string) error {
passwordHash, err := auth.HashPassword(password, argon2Conf)
if err != nil {
return err
}
userAuth := Auth{
Username: username,
Password: passwordHash,
}
return db.Create(&userAuth).Error
}
我正在处理处理函数中的错误:
func SignUpHandler(c *gin.Context) {
var form user
if err := c.ShouldBind(&form); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
if err := models.AddAuth(form.Username, form.Password); err == nil {
c.JSON(http.StatusOK, gin.H{"status": "you are signed in"})
} else {
// I think I have handled the sql error here
c.JSON(http.StatusBadRequest, gin.H{"error": "sign in failed"})
}
}
当我发送 POST
请求时,错误得到了正确处理,我得到了 {"error": "sign in failed"}
的正确响应。但控制台仍然打印此错误消息:
(/...../gym/models/auth.go:49)
[2019-04-28 23:37:06] Error 1062: Duplicate entry '123123' for key 'username'
[GIN] 2019/04/28 - 23:37:06 | 400 | 136.690908ms | ::1 | POST /signup
我很困惑,因为我处理了这个错误,但它仍然被打印出来。如何防止此错误打印到错误日志中?还是我处理的错误正确?
更新:对于 gorm v2
:
使用 gorm.Config
中的 Logger
:
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
})
对于 gorm v1
:
使用 db.LogMode 关闭默认错误记录器。
LogMode set log mode,
true
for detailed logs,false
for no log, default, will only print error logs.
db.LogMode(false)
应该能胜任!
我没有足够的声誉来发表评论,只是为了添加 ifnotak
的答案,您可以通过环境变量控制它来有条件地记录 sql。这在调试期间会很方便。
gormConfig := &gorm.Config{}
if !logSql {
// I use an env variable LOG_SQL to set logSql to either true or false.
gormConfig.Logger = logger.Default.LogMode(logger.Silent)
}
db, err := gorm.Open(dialector, gormConfig)