第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

在 Gorilla Handler 中記錄線程 ID

在 Gorilla Handler 中記錄線程 ID

Go
浮云間 2021-11-22 19:41:58
我們?nèi)绾蝨hread id在內(nèi)部登錄時獲取處理程序正在處理的 http 請求的唯一 ID 或任何其他唯一 ID Gorilla Handlers?在 Java 中,當 Tomcat 或其他容器處理多個 http 請求時,線程 ID 有助于跟蹤各個 http 請求處理的所有日志消息。中的等價物是Go什么?鑒于使用Gorilla庫開發(fā)的 Rest API ,如何在處理程序處理中跟蹤特定 http 請求的所有日志語句?
查看完整描述

2 回答

?
拉丁的傳說

TA貢獻1789條經(jīng)驗 獲得超8個贊

默認情況下,gorilla/handlers庫不提供執(zhí)行此操作的方法:那里的日志記錄功能以 Apache 格式登錄,而 Apache 格式不提供此功能。


也請記住,“線程ID”沒有意義在這里-你想有一個請求,即與相關(guān)的ID *http.Request。


您可以編寫自己的 RequestID 中間件,該中間件創(chuàng)建一個 ID 并將其存儲在請求上下文中,以便其他中間件/處理程序根據(jù)需要檢索:


package main


import (

    "crypto/rand"

    "encoding/base64"

    "net/http"


    "github.com/gorilla/context"

)


const ReqID string = "gorilla.RequestID"


// RequestID wraps handlers and makes a unique (32-byte) request ID available in

// the request context.

// Example:

//      http.Handle("/", RequestID(LoggingHandler(YourHandler)))

//

//      func LoggingHandler(h http.Handler) http.Handler {

//          fn := func(w http.ResponseWriter, r *http.Request) {

//              h.ServeHTTP(w, r)

//

//              id := GetRequestID(r)

//              log.Printf("%s | %s", id, r.RemoteAddr)

//          }

//

//          return http.HandlerFunc(fn)

//      }

func RequestID(h http.Handler) http.Handler {

    fn := func(w http.ResponseWriter, r *http.Request) {

        b := make([]byte, 8)

        _, err = rand.Read(&b)

        if err != nil {

            http.Error(w, http.StatusText(500), 500)

            return

        }


        base64ID := base64.URLEncoding.EncodeToString(b)


        context.Set(r, ReqID, base64ID)


        h.ServeHTTP(w, r)

        // Clear the context at the end of the request lifetime

        context.Clear(r)

    }


    return http.HandlerFunc(fn)

}


func GetRequestID(r *http.Request) string {

    if v, ok := context.GetOK(r, ReqID); ok {

        if id, ok := v.(string); ok {

            return id

        }

    }


    return ""

}

請記住,上面的代碼沒有經(jīng)過測試。在操場上寫下了我的頭頂,所以如果有錯誤,請告訴我。


除了這個基本示例之外,您還可以考慮改進:

  • 用主機名前綴 ID - 如果您從多個進程/機器聚合日志很有幫助)

  • 提供時間戳或遞增整數(shù)作為最終 ID 的一部分,以幫助跟蹤一段時間內(nèi)的請求

  • 對其進行基準測試。

請注意,在極高的負載下(例如,數(shù)以萬計的請求/秒 - 每天數(shù)以百萬計的點擊),這可能不是高性能的,但不太可能成為 > 99% 用戶的瓶頸。

PS:我可能會考慮在某個時候handlers.RequestID在 gorilla/handlers 庫中提供一個實現(xiàn)——如果你想看到它,在 repo 上提出一個問題,我會看看我是否能找到時間來實現(xiàn)一個更完整的實現(xiàn)在上面。


查看完整回答
反對 回復 2021-11-22
?
蠱毒傳說

TA貢獻1895條經(jīng)驗 獲得超3個贊

基于https://groups.google.com/forum/#!searchin/golang-nuts/Logging $20http$20thread/golang-nuts/vDNEH3_vMXQ/uyqGEwdchzgJ,ThreadLocalGo 無法實現(xiàn)概念。

每個需要記錄的地方,都需要傳入 httpRequest實例,以便可以檢索與請求關(guān)聯(lián)的上下文,并且可以從該上下文中獲取請求的唯一 ID。但是將 Request 實例傳遞給所有層/方法是不切實際的。

查看完整回答
反對 回復 2021-11-22
  • 2 回答
  • 0 關(guān)注
  • 250 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號