Golang Go语言中 context 和 logger 绑定的问题

发布于 1周前 作者 h691938207 来自 Go语言
import (
	"context"
"github.com/pingcap/log"
"go.uber.org/zap"
iris "github.com/kataras/iris/v12"

)

func NewContext(ctx iris.Context, fields …zap.Field) iris.Context { ctx.Values().Set(loggerKey, WithContext(ctx).With(fields…)) return ctx }

func WithContext(ctx iris.Context) *zap.Logger { if ctx == nil { return log.L() }

if ctxLogger, ok := ctx.Values().Get(loggerKey).(*zap.Logger); ok {
	return ctxLogger
} else {
	return log.L()
}

}

func NewStdContext(ctx context.Context, fields …zap.Field) iris.Context { ctx.WithValue(ctx, loggerKey, WithStdContext(ctx).With(fields…)) return ctx }

func WithStdContext(ctx context.Context) *zap.Logger { if ctx == nil { return log.L() }

if ctxLogger, ok := ctx.Value(loggerKey).(*zap.Logger); ok {
	return ctxLogger
} else {
	return log.L()
}

}

分别用到了 iris.Context 和 context.Context ,现在要给每个 context 写一个绑定方法。 请教下,有没有更好的实现方式?


Golang Go语言中 context 和 logger 绑定的问题

更多关于Golang Go语言中 context 和 logger 绑定的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

没用过 iris 、但用过 gin

在 gin 的设计里,gin.Context 中会包含 context.Context 字段,所以直接 set 到 context.Context 里就行,就不存在“要给每个 context 写一个绑定方法”

更多关于Golang Go语言中 context 和 logger 绑定的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


把这两包一下,不就是一个了,不一定非得用原生的

不要啥都往 context.Context 里面塞,塞一次 ctx 就多包裹一层。

1. 可以自定义 iris 自带的 logger 。

func main() {
app := iris.New()
logger := app.Logger()
logger.Printer.Output = os.Stderr

app.Get("/hello", func(ctx *irisctx.Context) {
log := ctx.Application().Logger()
log.Info(“HELLO”)
})
}

2. 使用依赖注入

type DemoAPI struct {
log *zap.Logger
}

func (a DemoAPI) Hello(ctx *irisctx.Context) {
a.log.Info(“HELLO”)
}

在Go语言中,将contextlogger绑定是一种常见的实践,这有助于在请求处理过程中传递和记录上下文信息,同时保持代码的整洁和可维护性。以下是对这一问题的专业解答:

在Go中,context包提供了一种在不同API边界之间传递请求范围值(包括截止日期、取消信号以及其他请求范围内的元数据)的方法。而logger则用于记录日志信息,帮助开发者跟踪和调试程序。

logger绑定到context上,可以通过创建一个自定义的context值来实现。这通常涉及到一个结构体,其中包含一个context.Context和一个*log.Logger。然后,你可以使用context.WithValue方法将这个结构体作为值传递给新的context

然而,需要注意的是,context.WithValue应该仅用于传递请求范围内的数据,并且键应该是不可变的。此外,由于context的值是不可变的(即你不能直接修改context中的值),因此任何对logger的修改(如设置新的输出级别)都需要在创建context之前完成。

在实际应用中,你可以通过中间件或初始化函数来设置contextlogger的绑定。这样,在后续的请求处理过程中,你就可以通过context方便地访问logger,并记录相关的日志信息。

总之,将contextlogger绑定是一种强大的技术,可以帮助你更好地管理请求范围内的数据和日志记录。但在使用时,需要遵循最佳实践,以确保代码的正确性和可维护性。

回到顶部