当前位置: 首页 > 面试题库 >

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

程禄
2023-03-14
问题内容

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

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


问题答案:

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

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

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

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

req = req.WithContext(context.WithValue(req.Context(),"requestId",ID))

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

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

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

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



 类似资料:
  • 我们使用Azure应用程序洞察并生成警报,还使用Webhooks。我们正在为生成的警报寻找应用程序洞察本身的日志(这不是应用程序的日志,而是关于生成的应用程序洞察警报的诊断日志),因为我们想要调试警报的webhook中发送了哪些数据以及url是什么的详细信息(应用程序洞察的详细日志)。有人知道我们在哪能找到那根木头吗?在AzureDiagnostics和Log Analytics中会有KQL吗?

  • 我有以下控制台附加器; 问题是我在这里使用的模式输出了一个空的ThreadContext()。我不想使用特定的密钥名称(例如,),因为系统非常广泛,密钥集也不同。示例输出: 2017-09-26 10:39:55396[main]信息:启动内部HTTP客户端{}

  • 我有一个logback配置,它有一个带有阈值筛选器的附加器: 这确保只有信息和更高级别(警告、错误)被记录到syslog。但是,我们使用的第三方库之一是在调试时记录特定事件,我希望将此事件记录到syslog。我想到的第一个方法是尝试重新映射日志记录程序中的日志级别,但不确定这是否可能?类似于: 谢谢,

  • 控制台日志是一个强大的方法,用来检查您的页面或应用程序。让我们从console.log()开始,探索其他高级用法。 TL;DR 使用console.log()进行基本日志记录 使用console.erroe()和console.warn()获取醒目的内容 使用console.group()和console.groupEnd()来分组相关消息,避免混乱 使用console.assert()显示条件语

  • 问题内容: 下面的selectItems是从会话作用域映射提供的。当用户单击Submit按钮时,应该在RequestScoped后备bean中设置一个日期字段并将其显示在页面上。 但是,收到以下转换错误: 我不确定为什么会收到此错误。我尝试在selectOneMenu标记上设置javax.faces.DateTime转换器,但随后收到一个甚至更神秘的验证错误。 找到了一条帖子,建议检查equal(

  • 问题内容: 我想通过请求中的项目填充日志记录上下文,例如:。我以为我可以在中间件的处理程序中覆盖Log类型。虽然它似乎不起作用,但我不确定为什么! 您能看到为什么在同一请求中对IIUC应该没有影响吗? 问题答案: 您需要对记录程序进行请求范围的检查。每当有新的连接进入时,就为整个处理程序全局设置它,这意味着您要进行数据争用以及通常不受欢迎的行为。 对于请求范围的上下文,请求中的嵌入是完美的。您可以