我是 Go 新手,所以請多多包涵。我正在嘗試使用 Uber 的 Zap 日志記錄包。我翻閱了文檔并查看了許多示例,但正在努力尋找如何最好地使用它。他們的常見問題解答部分說要避免使用 Zap 作為全局記錄器,所以我試圖將已初始化的內(nèi)容server.go(緊接在下面)傳遞給其他函數(shù)。// 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并嘗試使用中間件的可接受函數(shù)簽名,但我似乎無法弄清楚如何sugar在不讓我的 IDE 對我大喊大叫的情況下通過。我想要的是這樣的:Handler: middleware.Middleware{middleware.RequestIdentifier(sugar), middleware.RequestLogger(sugar)}.Apply(router)然后在我的中間件函數(shù)中,以某種方式訪問可用的記錄器,如下所示:func RequestIdentifier(next http.Handler, s *zap.SugaredLogger) http.Handler { ... }
1 回答

Cats萌萌
TA貢獻1805條經(jīng)驗 獲得超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 關(guān)注
- 101 瀏覽
添加回答
舉報
0/150
提交
取消