登录
首页 >  Golang >  Go问答

将如何将中间件函数链接收记录器作为参数进行设置?

来源:stackoverflow

时间:2024-02-17 23:12:24 336浏览 收藏

一分耕耘,一分收获!既然都打开这篇《将如何将中间件函数链接收记录器作为参数进行设置?》,就坚持看下去,学下去吧!本文主要会给大家讲到等等知识点,如果大家对本文有好的建议或者看到有不足之处,非常欢迎大家积极提出!在后续文章我会继续更新Golang相关的内容,希望对大家都有所帮助!

问题内容

我是 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 并尝试使用中间件接受的函数签名,但我似乎无法弄清楚如何在不让 ide 对我大喊大叫的情况下传递 sugar

我想要的是这样的东西:

handler: middleware.middleware{middleware.requestidentifier(sugar), middleware.requestlogger(sugar)}.apply(router)

然后在我的中间件函数中,可以以某种方式访问​​可用的记录器,如下所示:

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

正确答案


您需要再添加一层封闭:

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),

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>