为了账号安全,请及时绑定邮箱和手机立即绑定

在 golang 中捕获 stdErr 输出

在 golang 中捕获 stdErr 输出

Go
喵喵时光机 2023-07-04 19:13:44
我写了一个go程序来监控一些MySQL数据库。在下面的示例中,我只是显示“连接成功!” 连接成功时显示“连接错误:”,失败时显示错误消息。package mainimport (    "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:dialogConnection Error: this authentication plugin is not supported最后一行是我预期的消息,但是调用 db.Ping() 时会显示上一行。我想捕获/隐藏此消息[mysql] 2019/07/22 18:01:59 auth.go:293: unknown auth plugin:dialog,因为我已经收到一条干净的错误消息,我可以按照我的意愿处理它(显示或不显示)。如何防止出现此类错误消息(我的意思是在代码中,而不是在调用时)?
查看完整描述

1 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

您的自定义记录器可以执行对您的应用程序有意义的任何操作,包括“吞掉”这些日志记录语句,并且在没有错误的情况下不显示任何内容。


要回答问题的标题,您可以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())

}


查看完整回答
反对 回复 2023-07-04
  • 1 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信