我知道我们可以使用log
和fmt
打印变量或错误。例如,如果我想打印变量,我可以这样做:
h := "world"
fmt.Printf("hello = %v\n", h)
log.Printf("halo = %v\n", h)
输出将是:
hello = world
2016/12/30 09:13:12 halo = world
通常在错误处理中我发现这样的日志
if err != nil {
log.Println("Error : something terrible happen -> ", err)
return err
}
但是从上面的情况我也可以使用fmt
来打印错误,如此
fmt.Printf("Error : something terrible happen -> %v\n",err.Error())
使用fmt
代替log
打印错误是一种好习惯吗?
然后我总是使用fmt
而不是log
来在调试时打印变量。
答案 0 :(得分:20)
使用以下事实在log
和fmt
之间进行选择:
log
功能默认打印到stderr,可以directed to an arbitrary writer。 fmt.Printf
功能打印到stdout。log
函数可以print timestamp, source code location and other info。log
函数和fmt.Printf
都是线程安全的,但fmt.Printf
的并发写操作高于OS相关的大小可以交错。三个子问题的答案是"它取决于"。
答案 1 :(得分:6)
答案 2 :(得分:2)
如果您坚持使用fmt.Print *用于程序输出并且记录。*用于程序记录,通常不会遇到麻烦。
当然,如果您的程序没有“本地”输出(与大多数网络服务器程序一样),您可以同时使用它们进行日志记录,但对于日志记录日志。*更灵活,更贴切。
答案 3 :(得分:0)
摘自“ Essential Go”书
标准软件包log提供更多功能:
log.Printf("Logging")
log.Printf("Second line\n")
2019/03/26 10:07:11 Logging
2019/03/26 10:07:11 Second line
与fmt.Printf,log.Printf相比:
要记录致命问题:
f, err := os.Open("file.txt")
if err != nil {
log.Fatalf("os.Open('file.txt') failed with '%s'\n", err)
}
log.Fatalf记录消息并调用os.Exit(1)结束该过程。