gpt4 book ai didi

go - 在 golang 中捕获 stdErr 输出

转载 作者:IT王子 更新时间:2023-10-29 02:35:00 27 4
gpt4 key购买 nike

我写了一个go程序来监控一些MySQL数据库。

在下面的例子中,我只是简单地显示“连接成功!”连接成功时或“连接错误:”后跟失败时的错误消息。

package main

import (
"database/sql"
"fmt"

_ "github.com/go-sql-driver/mysql"
)

func main() {
err := mysqlConnect()
if err != nil {
fmt.Println("Connection Error:", err)
} else {
fmt.Println("Connection Success!")
}
}

func mysqlConnect() error {

db, err := sql.Open("mysql", "myuser:mypwd@tcp(10.2.0.3:3306)/mysql")
if err != nil {
return err
}
defer db.Close()

err = db.Ping()
if err != nil {
return err
}

return nil
}

这按预期工作,但在某些情况下,在执行 db.Ping() 时会出现一些错误消息并显示给 stdErr:

例如:

$ go run main.go
[mysql] 2019/07/22 18:01:59 auth.go:293: unknown auth plugin:dialog
Connection Error: this authentication plugin is not supported

最后一行是我预期的消息,但在调用 db.Ping() 时显示了上一行。

我想捕获/隐藏此消息 [mysql] 2019/07/22 18:01:59 auth.go:293: unknown auth plugin:dialog,因为我已经得到了一个干净的我可以根据需要处理的错误消息(显示或不显示)。

如何防止出现此类错误消息(我的意思是在代码中,而不是在调用时)?

最佳答案

正如@tkausi 的评论所建议的,您应该使用 https://godoc.org/github.com/go-sql-driver/mysql#SetLoggergo-sql-driver 包设置一个自定义记录器。

然后您的自定义记录器可以为您的应用程序做任何有意义的事情,包括“吞下”这些记录语句并且在没有错误的情况下不显示任何内容。


要回答问题的标题,您可以使用如下内容捕获 os.Stderr:

func doPrint() {
fmt.Fprintf(os.Stderr, "output")
}

func main() {
old := os.Stderr
r, w, _ := os.Pipe()
os.Stderr = w

doPrint()

w.Close()
var buf bytes.Buffer
io.Copy(&buf, r)
os.Stderr = old

fmt.Println("Captured:", buf.String())
}

关于go - 在 golang 中捕获 stdErr 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57150285/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com