亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

go微服務中如何給每條日志添加trace id

go微服務中如何給每條日志添加trace id

Go
慕森王 2023-06-19 17:00:33
我想將跟蹤 ID 添加到針對微服務的每個請求完成的日志記錄中。我希望這與 springboot 應用程序類似,我們可以在 MDC 中設置跟蹤 ID 并獲取它并在日志記錄時使用它。我做了一些研究,發現 go lang 中的 MDC 等價物是上下文。所以,我已經在我的上下文中設置了跟蹤 ID?,F在的問題是我必須使用跟蹤 ID 登錄的地方,我需要將上下文傳遞給該函數,這是非常丑陋的方式。我正在為這個問題尋找更好的解決方案。func HandlerFunction(f gin.HandlerFunc) gin.HandlerFunc{    return func(cxt *gin.Context) {        reqraceId := cxt.Request.Header.Get("trace-id")        requid , _ := uuid.NewRandom()        if reqTraceId == "" {            c.Request.Header.Set("trace-id", requid.String())        }        f(c)    }}
查看完整描述

3 回答

?
犯罪嫌疑人X

TA貢獻2080條經驗 獲得超4個贊

context.Context其中有一節說:

在谷歌,我們要求 Go 程序員將 Context 參數作為第一個參數傳遞給傳入和傳出請求之間的調用路徑上的每個函數。

TL;DR - 傳遞上下文很好,但最好的方法是什么?

有兩種主要模式

  1. 詢問上下文給你一個記錄器

  2. 為記錄器提供上下文

上下文可用于存儲值:

context.WithValue(ctx,?someKey,?someValue)

這意味著我們可以這樣做:

somepackage.Log(ctx).Info("hello?world")
//?or
sompackage.Info(ctx,?"hello?world")

這兩個示例 API 的實現可以與上下文交互以檢索所需的值,而無需擔心任何日志調用站點的 MDC 中的額外信息。


查看完整回答
反對 回復 2023-06-19
?
慕妹3242003

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("......")

}


查看完整回答
反對 回復 2023-06-19
?
DIEA

TA貢獻1820條經驗 獲得超3個贊

這個問題也可以使用依賴注入容器來解決。

我們可以實現“請求范圍”注入,因此,對于每個請求,我們將重新創建所有使用請求范圍依賴項的依賴樹(記錄器、錯誤報告器、通過上下文傳播將請求發送到另一個服務的客戶端)。

但據我所知,使用依賴注入容器并不是最佳實踐,也不是“慣用”方式。

此外,這種方法可能會有一些性能和內存問題,因為我們將為每個請求重新創建對象。


查看完整回答
反對 回復 2023-06-19
  • 3 回答
  • 0 關注
  • 617 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號