我是 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),
- 1 回答
- 0 关注
- 66 浏览
添加回答
举报
0/150
提交
取消