go微服务中如何给每条日志添加trace id

How to add trace id to each logs in go micro service

我想将跟踪 ID 添加到为每个微请求完成的日志记录 service.I 想要这个类似于 springboot 应用程序,我们可以在 MDC 中设置跟踪 ID 并获取它并在日志记录时使用它。

我做了一些研究,发现 Go 语言中的 MDC 等价物是上下文。所以,我已经在我的上下文中设置了跟踪 ID。现在的问题是我必须使用跟踪 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)
    }
}

可能值得一读 context.Context,尤其是 this article,其中有一节说:

At Google, we require that Go programmers pass a Context parameter as the first argument to every function on the call path between incoming and outgoing requests.

TL;DR - 可以传递上下文,但最好的方法是什么?

主要有两种模式

  1. 求上下文给你一个记录器
  2. 为记录器提供上下文

上下文可用于存储值:

context.WithValue(ctx, someKey, someValue)

这意味着我们可以这样做:

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

这两个示例 API 的实现可以与上下文交互以检索所需的值,而无需担心任何日志调用站点的 MDC 中的额外信息。