Golang Go语言中 context 和 logger 绑定的问题
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
没用过 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语言中,将context
和logger
绑定是一种常见的实践,这有助于在请求处理过程中传递和记录上下文信息,同时保持代码的整洁和可维护性。以下是对这一问题的专业解答:
在Go中,context
包提供了一种在不同API边界之间传递请求范围值(包括截止日期、取消信号以及其他请求范围内的元数据)的方法。而logger
则用于记录日志信息,帮助开发者跟踪和调试程序。
将logger
绑定到context
上,可以通过创建一个自定义的context
值来实现。这通常涉及到一个结构体,其中包含一个context.Context
和一个*log.Logger
。然后,你可以使用context.WithValue
方法将这个结构体作为值传递给新的context
。
然而,需要注意的是,context.WithValue
应该仅用于传递请求范围内的数据,并且键应该是不可变的。此外,由于context
的值是不可变的(即你不能直接修改context
中的值),因此任何对logger
的修改(如设置新的输出级别)都需要在创建context
之前完成。
在实际应用中,你可以通过中间件或初始化函数来设置context
和logger
的绑定。这样,在后续的请求处理过程中,你就可以通过context
方便地访问logger
,并记录相关的日志信息。
总之,将context
和logger
绑定是一种强大的技术,可以帮助你更好地管理请求范围内的数据和日志记录。但在使用时,需要遵循最佳实践,以确保代码的正确性和可维护性。