我正在重新編寫我們用 golang 編寫的小型 Web 應(yīng)用程序的日志記錄。由于外部要求,日志記錄已被隔離在一個地方,因此我們以后可能會切換到日志記錄服務(wù)器。(不是我的想法 - 我保證......)盡管如此,我們現(xiàn)在能夠記錄常見的事情,如日期/時間、行號、用戶和消息,主要使用標(biāo)準(zhǔn)庫的一部分和我們傳遞的用戶/會話結(jié)構(gòu)大約。但是 - 問題來了 - 在較低級別的方法中,為了記錄而傳遞會話只是為了獲取用戶名是一種浪費。所以我想找到其他東西來在日志文件中找到一個特定的請求。我確信有一些我沒有想到的明顯的東西。到目前為止的想法:Java 日志框架可以打印出線程 id,這在這種情況下也足夠了。只是它在golang中被稱為其他東西?以某種方式使用戶/會話結(jié)構(gòu)可以全局訪問。(除非有一個線程用作查找鍵,否則仍然需要傳遞會話 ID。回到想法 1。)無論如何放棄并傳遞用戶/會話結(jié)構(gòu)。不要在最低級別記錄錯誤,而只在用戶/會話結(jié)構(gòu)可用時記錄錯誤。不過行號不會那么好。我們將 gorilla 的一部分用于網(wǎng)絡(luò)事物,除此之外主要是標(biāo)準(zhǔn)庫。對此有何建議和想法?
1 回答

MMMHUHU
TA貢獻1834條經(jīng)驗 獲得超8個贊
由于濫用的可能性很高,因此無法訪問 Go 中當(dāng)前 goroutine 的標(biāo)識符。這可能看起來很嚴(yán)厲,但這實際上保留了 Go 包生態(tài)系統(tǒng)的一個重要屬性:是否啟動一個新的 goroutine 來做某事并不重要。
也就是說,對于函數(shù) F 的任何方法:
F()
幾乎完全等同于:
done := make(chan struct{})
go func() {
defer close(done)
F()
}
<-done
(“幾乎”來自這樣一個事實,如果 F 恐慌,恐慌將不會被原始 goroutine 捕獲)。
這也適用于日志記錄 - 如果您使用當(dāng)前的 goroutine 來推斷當(dāng)前用戶,則任何如上所述啟動新 goroutine 的代碼都會破壞該假設(shè),并且您的日志記錄將不包含預(yù)期的信息。
您需要傳遞某種上下文。
- 1 回答
- 0 關(guān)注
- 195 瀏覽
添加回答
舉報
0/150
提交
取消