1 回答
TA贡献1816条经验 获得超6个赞
每次调用该函数时,都会创建一个新的 *log。输入并再次将请求 ID 写入其中。从你的问题来看,听起来你不希望这样。logger
func main() {
ctx := context.Background()
ctx = context.WithValue(ctx, keyA, "foo")
ctx = context.WithValue(ctx, keyB, "bar")
lg := logger(ctx)
lg.Info("did nothing")
err := errors.New("an error")
lg.WithError(err).Fatal("unrecoverable error")
}
func logger(ctx context.Context) *log.Entry {
entry := log.WithField("component", "main")
entry = entry.WithField("ReqID", "myRequestID")
return entry
}
这样做的缺点是,您必须将变量传递给此请求调用的每个函数,并且该函数还应记录请求 ID。lg
我们在公司所做的是创建一个薄层,该层具有一个额外的方法,因此我们可以传入请求上下文,它将提取请求ID本身(我们已经在中间件中写入了上下文)。如果不存在任何请求 ID,则不会向日志条目添加任何内容。但是,这确实将请求 ID 再次添加到每个日志条目中,就像您的示例代码一样。logrusWithRequestCtx
注意:我们围绕logrus的薄层具有更多的功能和默认设置,以证明额外的努力是合理的。从长远来看,有一个地方能够调整我们所有服务的日志记录是非常有帮助的。
注意2:同时,我们正在用零日志替换logrus,以使其更加轻量级。
- 1 回答
- 0 关注
- 129 浏览
添加回答
举报