为了账号安全,请及时绑定邮箱和手机立即绑定

如何将记录器作为参数传递给中间件函数链?

如何将记录器作为参数传递给中间件函数链?

Go
猛跑小猪 2022-10-17 16:07:27
我是 Go 新手,所以请多多包涵。我正在尝试使用 Uber 的 Zap 日志记录包。我翻阅了文档并查看了许多示例,但正在努力寻找如何最好地使用它。他们的常见问题解答部分说要避免使用 Zap 作为全局记录器,所以我试图将已初始化的内容server.go(紧接在下面)传递给其他函数。// Initialize loggerlogger, err := zap.NewProduction()if err != nil {    log.Fatalf("Failed to initialize zap logger: %v", err)}defer logger.Sync()sugar := logger.Sugar()sugar.Info("Server is starting...")router := http.NewServeMux()server := &http.Server{    Addr:         addr,    Handler:      middleware.Middleware{middleware.RequestIdentifier, middleware.RequestLogger}.Apply(router),    // ...other fields}在Middleware另一个文件中定义的位置为type Middleware []func(http.Handler) http.Handler// Apply() builds the middleware array into a handler chainfunc (midware Middleware) Apply(handler http.Handler) http.Handler {    if len(midware) == 0 {        return handler    }    return midware[:len(midware)-1].Apply(midware[len(midware)-1](handler))}然后在另一个文件 ( request_identifier.go) 中。func RequestIdentifier(next http.Handler) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        //        // ...stuff, and use Zap here        //        next.ServeHTTP(w, r)    })}对于其他中间件功能也是如此。我尝试过包装RequestIdentifier并尝试使用中间件的可接受函数签名,但我似乎无法弄清楚如何sugar在不让我的 IDE 对我大喊大叫的情况下通过。我想要的是这样的:Handler: middleware.Middleware{middleware.RequestIdentifier(sugar), middleware.RequestLogger(sugar)}.Apply(router)然后在我的中间件函数中,以某种方式访问可用的记录器,如下所示:func RequestIdentifier(next http.Handler, s *zap.SugaredLogger) http.Handler { ... }
查看完整描述

1 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

您需要再添加一层闭包:


func RequestIdentifier(s *zap.SugaredLogger) func(http.Handler) http.Handler {

    return func(next http.Handler) http.Handler {

        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

            //

            // ...stuff, and use Zap here

            //

            next.ServeHTTP(w, r)

        })

    }

}


Handler: middleware.Middleware{middleware.RequestIdentifier(sugar), middleware.RequestLogger(sugar)}.Apply(router),



查看完整回答
反对 回复 2022-10-17
  • 1 回答
  • 0 关注
  • 66 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信