Go语言 什么是正确的方式来使用日志记录沿着上下文?

6ojccjat  于 2023-03-06  发布在  Go
关注(0)|答案(3)|浏览(134)

我正在Golang建立一个Web服务器。你知道Golang有一个context包,它的offically recommended总是传递一个上下文作为第一个参数。context.Context有一个Value方法来保持变量在上下文下。
然而,大多数日志库也提供了继承日志的方法,比如说,使用父日志的字段创建子日志。在logrus(或其他日志,无所谓)中,您可以创建一个logrus.Entry并应用WithFields来获得子日志。
例如,当每个HTTP请求到来时,附加一个request-id。我希望它被放在上下文中,并且在每个日志中记录为一个字段。
那么,如何以一种恰当的方式做到这一点呢?
谢谢!

k2fxgqgv

k2fxgqgv1#

你可以从传入的请求中获取request-id,然后使用上下文将request-id传递给你正在调用的函数,下面是一个例子:https://medium.com/@cep21/how-to-correctly-use-context-context-in-go-1-7-8f2c0fafdf39。对于日志记录:使用标准日志库定义您自己的日志记录器

func CreateCustomLogger(requestId string) *log.Logger {
    defaultLoggingFlags := 
log.Ldate|log.Ltime|log.LUTC|log.Lmicroseconds|log.Lshortfile
    return log.New(os.Stderr, requestId + ": ", defaultLoggingFlags)
}

在您的函数中:

customLogger := CreateCustomLogger(requestId)
customLogger.Printf("Custom log message")
vuktfyat

vuktfyat2#

您可以创建自定义格式化程序并设置它。请看这里。

ercv8c1e

ercv8c1e3#

每个Http请求都有它自己的上下文,我只是在中间件中像这样合并请求ID。

Request = Request.WithContext(context.WithValue(Request.Context(), "request_uuid", uid))

相关问题