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

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