具有映射诊断上下文的Golang日志记录

Ga *_*chi 2 go mdc

如何在GoLang中实现 MDC日志记录(Java)?

我需要在所有服务器日志中添加UUID,以便能够跟踪并发请求。

Dav*_*rth 6

Java MDC依赖于线程本地存储,而Go则没有。

最接近的事情是通过您的堆栈线程上下文

这就是越来越多的Go语言库正在做的事情。

一种比较典型的方法是通过中间件软件包来执行此操作,该中间件软件包将请求ID添加到Web请求的上下文中,例如:

req = req.WithContext(context.WithValue(req.Context(),"requestId",ID))
Run Code Online (Sandbox Code Playgroud)

然后,假设您传递了上下文,则将其拉出ctx.Value("requestId")并在有意义的地方使用它。

可能使您自己的自定义记录器功能如下:

func logStuff(ctx context.Context, msg string) {
    log.Println(ctx.Value("requestId"),msg) // call stdlib logger
}
Run Code Online (Sandbox Code Playgroud)

您可能想用多种方法来处理此问题,但这是一种相当简单的形式。

  • Go 永远不会停止对愚蠢的设计决策感到惊讶,这些决策在许多其他语言和生态系统中都已解决 (3认同)
  • 当然,有些地方人们可能会说,嗯,很奇怪。我不认为这是其中之一。Threadlocals 是具有它们的语言中错误的重要来源。人们使用 . (2认同)
  • 不要使用字符串作为键。请改用私有类型的值以避免任何冲突。`type requestIdKey struct{}` `req = req.WithContext(context.WithValue(req.Context(),requestIdKey{},ID))` (2认同)