何时使用log over fmt进行调试和打印错误?

时间:2016-12-30 02:43:30

标签: go

我知道我们可以使用logfmt打印变量或错误。例如,如果我想打印变量,我可以这样做:

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来在调试时打印变量。

4 个答案:

答案 0 :(得分:20)

使用以下事实在logfmt之间进行选择:

三个子问题的答案是"它取决于"。

答案 1 :(得分:6)

我想补充一点:

  • 日志是线程安全的,因为fmt不是。

    Logger可以同时使用多个goroutine;它保证序列化对Writer的访问。

Link

答案 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相比:

  • 默认情况下登录到stderr(os.Stderr)
  • 将当前时间添加到每个日志行
  • 通过添加\ n(如果未明确提供)来确保回显日志独立存在

要记录致命问题:

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)结束该过程。