3 回答
TA貢獻2080條經(jīng)驗 獲得超4個贊
在谷歌,我們要求 Go 程序員將 Context 參數(shù)作為第一個參數(shù)傳遞給傳入和傳出請求之間的調(diào)用路徑上的每個函數(shù)。
TL;DR - 傳遞上下文很好,但最好的方法是什么?
有兩種主要模式
詢問上下文給你一個記錄器
為記錄器提供上下文
上下文可用于存儲值:
context.WithValue(ctx,?someKey,?someValue)
這意味著我們可以這樣做:
somepackage.Log(ctx).Info("hello?world")
//?or
sompackage.Info(ctx,?"hello?world")這兩個示例 API 的實現(xiàn)可以與上下文交互以檢索所需的值,而無需擔心任何日志調(diào)用站點的 MDC 中的額外信息。
TA貢獻1824條經(jīng)驗 獲得超6個贊
在我這邊,我發(fā)現(xiàn)使用默認的日志包我們可以將前綴設置為log.SetPrefix(traceId),這樣做,日志將打印跟蹤 ID 作為實際和子函數(shù)/結(jié)構(gòu)中的前綴。
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條經(jīng)驗 獲得超3個贊
這個問題也可以使用依賴注入容器來解決。
我們可以實現(xiàn)“請求范圍”注入,因此,對于每個請求,我們將重新創(chuàng)建所有使用請求范圍依賴項的依賴樹(記錄器、錯誤報告器、通過上下文傳播將請求發(fā)送到另一個服務的客戶端)。
但據(jù)我所知,使用依賴注入容器并不是最佳實踐,也不是“慣用”方式。
此外,這種方法可能會有一些性能和內(nèi)存問題,因為我們將為每個請求重新創(chuàng)建對象。
- 3 回答
- 0 關注
- 640 瀏覽
添加回答
舉報
