0%

Go Log引发的问题

写 Go 代码的时候,我期望将 cmd 的错误信息打印出来,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
var cmdOut, cmdErr bytes.Buffer
cmd.Stdout = &cmdOut
cmd.Stderr = &cmdErr
err := cmd.Run()
if err != nil {
log.Fatal(err)
// log.Println(err)
}
cmdStdout := ConvertByte2String([]byte(cmdOut.String()), "GB18030")
cmdStderr := ConvertByte2String([]byte(cmdErr.String()), "GB18030")
fmt.Println("cmdStdout:", cmdStdout)
fmt.Println("cmdStderr:", cmdStderr)

ping 一个不通的域名产生了报错,什么都没有打印出来,而是给了个返回码2。

当时我没有意识到这个问题,把代码发到群里,一个大佬 Cavan.xu 跑了一下代码,指出了问题出现在 log.Fatal 上。

改了一下,程序如期运行。

1
2
// log.Fatal(err)
log.Println(err)

看一下这个 log.Fatal 源码。Fatal 等价于 Print() 然后调用 os.Exit(1)。

1
2
3
4
5
// Fatal is equivalent to Print() followed by a call to os.Exit(1).
func Fatal(v ...interface{}) {
std.Output(2, fmt.Sprint(v...))
os.Exit(1)
}