使用记录器和上下文的正确方法是什么?

时间:2016-11-29 02:03:35

标签: logging go

我正在Golang中构建一个Web服务器。你知道Golang有一个context包,并且offically recommended总是传递一个上下文作为第一个参数。 context.Context有一个Value方法可以将变量保存在上下文中。

但是,大多数日志记录库还提供了一种继承记录器的方法,例如,创建包含其父级字段的子记录器。在logrus(或其他一些记录器,无关紧要)中,您可以创建logrus.Entry并应用WithFields来获取子记录器。

例如,当附加request-id的每个HTTP请求时。我希望将它放在上下文中,并在每个日志中记录为一个字段。

那么,如何以正确的方式做到这一点?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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")