解读Hertz日志相关中间件标题 | 青训营

118 阅读2分钟

官方文档

X-Request-ID 在 HTTP Headers 中是一种非标准响应字段,通常用于关联客户端和服务器之间的 HTTP 请求。 Hertz 也提供了可以对 X-Request-ID 进行操作的 Request ID 中间件

  • 主要用途:Hertz 提供了 requestid 中间件以及内置的 hlog 日志库与一些 hlog 日志组件的扩展 ,本文主要讲解如何将请求ID与日志关联方便用户查找日志。
  • 主要作用:它的主要作用是在请求的响应和 context 中添加 rquestid,用于唯一标识一次请求。

案例:

package main
​
import (
    "context"
​
    "github.com/cloudwego/hertz/pkg/app"
    "github.com/cloudwego/hertz/pkg/app/server"
    "github.com/cloudwego/hertz/pkg/common/hlog"
    "github.com/cloudwego/hertz/pkg/common/utils"
    "github.com/cloudwego/hertz/pkg/protocol/consts"
    "github.com/hertz-contrib/requestid"
)
​
func main() {
    h := server.Default()
​
    h.Use(
        // 自定义 request id 生成逻辑
        requestid.New(
            requestid.WithGenerator(func(ctx context.Context, c *app.RequestContext) string {
                return "cloudwego.io"
            }),
            // 自定义 request id 响应头键值
            requestid.WithCustomHeaderStrKey("Your-Customised-Key"),
        ),
    )
​
    // Example ping request.
    h.GET("/ping", func(ctx context.Context, c *app.RequestContext) {
        hlog.Info(string(c.Response.Header.Header()))
        c.JSON(consts.StatusOK, utils.H{"ping": "pong"})
    })
​
    h.Spin()
}

访问 127.0.0.1:8888/ping,我们会发现响应头中多出了一个 X-request-ID:cloudwego.io 字段。并且将响应头信息记录为日志(这里假设 hlog 是日志记录库的实例)

  • 具体解读:

这段代码展示了使用 cloudwego.io 作为自定义 Request ID 生成器,并将生成的 Request ID 设置到响应头中的自定义键名 Your-Customised-Key 中。

以下是对这段代码的解释:

首先,在 h.Use() 中调用了 requestid.New 方法,它返回一个中间件函数对象。该中间件函数用于为每个请求生成唯一的 Request ID,并将其设置到上下文中。

requestid.New 的参数中,我们传入了两个选项:

  1. 使用了 WithGenerator 方法,指定了一个自定义的 Request ID 生成函数。该函数接收一个上下文对象和请求上下文 c,并返回一个字符串作为生成的 Request ID。在这个例子中,生成的 Request ID 固定为 "cloudwego.io",也可以根据实际需求自定义其他生成逻辑。
  2. 使用了 WithCustomHeaderStrKey 方法,指定了一个自定义的请求头键名。生成的 Request ID 将被设置到该键名对应的请求头中。在这个例子中,自定义的键名为 "Your-Customised-Key",你可以根据实际需求自定义其他请求头键名。

接下来,在 h.GET("/ping", ...) 中定义了一个简单的 Ping 请求处理函数。该处理函数使用 c.Response.Header 对象来访问响应头,并使用 hlog.Info 将响应头信息记录为日志(这里假设 hlog 是日志记录库的实例)。然后,使用 c.JSON 方法将包含 "ping": "pong" 的 JSON 响应发送回客户端。

总结来说,这段代码的功能是:

  • 创建一个自定义的 Request ID 生成器,并将生成的 Request ID 设置到响应头中的自定义键名中。
  • 定义一个处理 Ping 请求的函数,并在响应中返回一个包含 "ping": "pong" 的 JSON。