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

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

如何使用 Gin 上下文創(chuàng)建的請求 ID 記錄 HTTP 客戶端的請求

如何使用 Gin 上下文創(chuàng)建的請求 ID 記錄 HTTP 客戶端的請求

Go
侃侃無極 2022-09-05 18:00:57
想法:我想用唯一的請求ID記錄傳入和傳出的請求到我的Gin服務(wù)器。另外,我想使用與路由相同的請求ID在我的Gin路由內(nèi)記錄所有HTTP客戶端的請求。所有這些都應(yīng)該使用中間件在引擎蓋下工作。記錄對我的服務(wù)器的請求(和響應(yīng))為了記錄對服務(wù)器的每個請求,我編寫了以下中間件:import (    "bytes"    "context"    "github.com/gin-contrib/requestid"    "github.com/gin-gonic/gin"    "github.com/rs/zerolog/log"    "io/ioutil"    "net/http"    "time")type responseBodyWriter struct {    gin.ResponseWriter    body *bytes.Buffer}func (r responseBodyWriter) Write(b []byte) (int, error) {    r.body.Write(b)    return r.ResponseWriter.Write(b)}func LoggerMiddleware() gin.HandlerFunc {    return func(c *gin.Context) {        start := time.Now()        w := &responseBodyWriter{body: &bytes.Buffer{}, ResponseWriter: c.Writer}        c.Writer = w        msg := "Input:"        path := c.Request.URL.Path        raw := c.Request.URL.RawQuery        if raw != "" {            path = path + "?" + raw        }        // Read from body and write here again.        var bodyBytes []byte        if c.Request.Body != nil {            bodyBytes, _ = ioutil.ReadAll(c.Request.Body)        }        c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))        inputLogger := log.With().            Str("method", c.Request.Method).            Str("path", path).            Str("requestId", requestid.Get(c)).            Logger()        if len(bodyBytes) > 0 {            inputLogger.Info().RawJSON("body", bodyBytes).Msg(msg)        } else {            inputLogger.Info().Msg(msg)        }
查看完整描述

2 回答

?
守著星空守著你

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

該函數(shù)采用一個參數(shù),因此您應(yīng)該能夠通過在處理程序中創(chuàng)建一個請求來傳遞Gin上下文:Transport.RoundTrip*http.Request


func MyHandler(c *gin.Context) {

        // passing context to the request

        req := http.NewRequestWithContext(c, "GET", "http://localhost:8080", nil)

        resp, err := http.DefaultClient.Do(req)

}

請注意,為了能夠在不進行其他初始化的情況下使用您覆蓋的默認值,應(yīng)使用 .RoundTripperhttp.DefaultClient


查看完整回答
反對 回復(fù) 2022-09-05
?
胡子哥哥

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

您可以使用以下命令:

https://github.com/sumit-tembe/gin-requestid


package main


import (

    "net/http"


    "github.com/gin-gonic/gin"

    requestid "github.com/sumit-tembe/gin-requestid"

)


func main() {

    // without any middlewares

    router := gin.New()


    // Middlewares

    {

        //recovery middleware

        router.Use(gin.Recovery())

        //middleware which injects a 'RequestID' into the context and header of each request.

        router.Use(requestid.RequestID(nil))

        //middleware which enhance Gin request logger to include 'RequestID'

        router.Use(gin.LoggerWithConfig(requestid.GetLoggerConfig(nil, nil, nil)))

    }


    router.GET("/", func(c *gin.Context) {

        c.String(http.StatusOK, "Hello world!")

    })


    router.Run(":8080")

}

輸出:


[GIN-debug] 2019-12-16T18:50:49+05:30 [bzQg6wTpL4cdZ9bM] - "GET /"

[GIN-debug] 2019-12-16T18:50:49+05:30 [bzQg6wTpL4cdZ9bM] - [::1] "GET / HTTP/1.1 200 22.415μs" Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36

它還支持自定義請求ID生成器,您可以根據(jù)需要進行設(shè)計。


查看完整回答
反對 回復(fù) 2022-09-05
  • 2 回答
  • 0 關(guān)注
  • 442 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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