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 写一个绑定方法。 请教下,有没有更好的实现方式?
1
gitrebase 2023-12-20 21:14:21 +08:00
没用过 iris 、但用过 gin
在 gin 的设计里,gin.Context 中会包含 context.Context 字段,所以直接 set 到 context.Context 里就行,就不存在“要给每个 context 写一个绑定方法” |
2
pennai 2023-12-20 23:59:14 +08:00
把这两包一下,不就是一个了,不一定非得用原生的
|
3
bv 2023-12-21 10:26:10 +08:00
不要啥都往 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") } |