3 回答

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

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超6個(gè)贊
在我這邊,我發(fā)現(xiàn)使用默認(rèn)的日志包我們可以將前綴設(shè)置為log.SetPrefix(traceId),這樣做,日志將打印跟蹤 ID 作為實(shí)際和子函數(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貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超2個(gè)贊
這個(gè)問題也可以使用依賴注入容器來解決。
我們可以實(shí)現(xiàn)“請求范圍”注入,因此,對于每個(gè)請求,我們將重新創(chuàng)建所有使用請求范圍依賴項(xiàng)的依賴樹(記錄器、錯(cuò)誤報(bào)告器、通過上下文傳播將請求發(fā)送到另一個(gè)服務(wù)的客戶端)。
但據(jù)我所知,使用依賴注入容器并不是最佳實(shí)踐,也不是“慣用”方式。
此外,這種方法可能會有一些性能和內(nèi)存問題,因?yàn)槲覀儗槊總€(gè)請求重新創(chuàng)建對象。
- 3 回答
- 0 關(guān)注
- 597 瀏覽
添加回答
舉報(bào)