3 回答

TA貢獻2080條經驗 獲得超4個贊
在谷歌,我們要求 Go 程序員將 Context 參數作為第一個參數傳遞給傳入和傳出請求之間的調用路徑上的每個函數。
TL;DR - 傳遞上下文很好,但最好的方法是什么?
有兩種主要模式
詢問上下文給你一個記錄器
為記錄器提供上下文
上下文可用于存儲值:
context.WithValue(ctx,?someKey,?someValue)
這意味著我們可以這樣做:
somepackage.Log(ctx).Info("hello?world") //?or sompackage.Info(ctx,?"hello?world")
這兩個示例 API 的實現可以與上下文交互以檢索所需的值,而無需擔心任何日志調用站點的 MDC 中的額外信息。

TA貢獻1824條經驗 獲得超6個贊
在我這邊,我發現使用默認的日志包我們可以將前綴設置為log.SetPrefix(traceId),這樣做,日志將打印跟蹤 ID 作為實際和子函數/結構中的前綴。
import (
"log"
"github.com/google/uuid"
)
func (hdl *HTTPHandler) example() {
var traceId string = uuid.NewString()
log.SetPrefix(traceId + " - ")
log.SetFlags(log.LstdFlags)
// ...
// ...
log.Println("......")
}

TA貢獻1820條經驗 獲得超3個贊
這個問題也可以使用依賴注入容器來解決。
我們可以實現“請求范圍”注入,因此,對于每個請求,我們將重新創建所有使用請求范圍依賴項的依賴樹(記錄器、錯誤報告器、通過上下文傳播將請求發送到另一個服務的客戶端)。
但據我所知,使用依賴注入容器并不是最佳實踐,也不是“慣用”方式。
此外,這種方法可能會有一些性能和內存問題,因為我們將為每個請求重新創建對象。
- 3 回答
- 0 關注
- 617 瀏覽
添加回答
舉報