2016-12-30 79 views
3

我知道我们可以使用logfmt来打印变量或错误。例如,如果我想打印可变我可以这样做:何时使用登录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

的可能的复制[我为什么要使用log.Println代替fmt.Println?](https://stackoverflow.com/questions/19646889/why-should-i-use- log-println-instead-of-fmt-println) – mayo

回答

9

选择logfmt使用这些事实之间:

答案的三个子问题是“这取决于”。

+0

可以告诉我一个关于'日志函数可以打印时间戳,源代码位置和其他信息的例子。 – BlackMamba

+1

@BlackMamba https://play.golang。org/p/ayyU7Yuo6l –

2

你一般,如果你坚持使用fmt.Print *方案输出和日志不惹上麻烦。*用于记录程序

当然,如果你的程序没有“本地”输出(因为大多数网络服务器程序),你可以用于记录同时使用,但对于记录日志。*是更加灵活和容易。

3

我想补充一点:

  • 登录是线程安全的地方作为FMT是没有的。

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

Link

+0

你怎么知道'log'是否线程安全?对此有何参考?谢谢 –

+2

@GujaratSantana [记录器文档](https://godoc.org/log#Logger)指出,可以从多个goroutines同时使用记录器。没有关于'fmt.Printf'线程安全性的文档。 'fmt.Printf'实现是线程安全的,它不太可能会被改为不是线程安全的。 –

+2

实际上,虽然'fmt.Printf'是线程安全的,它没有任何数据竞争,Logger使用一个互斥量来串行化输出,而fmt直接写出来。有了足够的并发性,您可以将交错写入到标准输出。 – JimB