登录
首页 >  Golang >  Go问答

在Go微服务中如何实现日志中的Trace ID记录

来源:stackoverflow

时间:2024-02-29 16:06:25 481浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《在Go微服务中如何实现日志中的Trace ID记录》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我想将跟踪 id 添加到为微服务的每个请求完成的日志记录中。我希望这与 springboot 应用程序类似,我们可以在 mdc 中设置跟踪 id 并获取它并在记录时使用它。

我做了一些研究,发现 go lang 中的 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,其中有一个部分说:

在 google,我们要求 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 中的额外信息。

从我的角度来看,我发现使用默认的日志包我们可以将前缀设置为 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("......")
}

以上就是《在Go微服务中如何实现日志中的Trace ID记录》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>