猿问

在 golang 中捕获 stdErr 输出

我写了一个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,因为我已经收到一条干净的错误消息,我可以按照我的意愿处理它(显示或不显示)。


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


喵喵时光机
浏览 122回答 1
1回答

慕工程0101907

您的自定义记录器可以执行对您的应用程序有意义的任何操作,包括“吞掉”这些日志记录语句,并且在没有错误的情况下不显示任何内容。要回答问题的标题,您可以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())}
随时随地看视频慕课网APP

相关分类

Go
我要回答