2016-12-30 38 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

相關問題