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

我是 Go 新手,所以请多多包涵。


我正在尝试使用 Uber 的 Zap 日志记录包。我翻阅了文档并查看了许多示例,但正在努力寻找如何最好地使用它。他们的常见问题解答部分说要避免使用 Zap 作为全局记录器,所以我试图将已初始化的内容server.go(紧接在下面)传递给其他函数。


// Initialize logger

logger, 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 chain

func (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 { ... }


猛跑小猪
浏览 67回答 1
1回答

Cats萌萌

您需要再添加一层闭包: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),
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go