大猩猩多路复用器,'catch'响应代码的最佳方式

问题描述:

我使用Gorilla多路复用器来处理所有的路由。现在我的应用程序工作正常,我想找到一种方法来记录我的所有响应代码,例如statds。我发现这个包:https://godoc.org/github.com/gorilla/handlers#LoggingHandler大猩猩多路复用器,'catch'响应代码的最佳方式

这使我可以输出所有的响应到Apache格式。虽然这很好,但它不是我想要的100%。我只是想要extract的回应状态,并将它们发送到statds。现在最好/最简单的方法是什么?

package main 

import (
    "log" 
    "net/http" 
    "os" 

    "github.com/gorilla/handlers" 
    "github.com/gorilla/mux" 
    "github.com/rogierlommers/mux-status-handler/articles" 
    "github.com/rogierlommers/mux-status-handler/users" 
) 

func main() { 
    r := mux.NewRouter() 
    r.HandleFunc("/products", articles.Handler) 
    r.HandleFunc("/users", users.Handler) 

    loggedRouter := handlers.LoggingHandler(os.Stdout, r) 
    log.Println("listening on 8080") 
    http.ListenAndServe(":8080", loggedRouter) 
} 

上面的代码给了我这样的:

apache logformat output

所以我在寻找类似的,但而不是输出Apache的访问日志到标准输出的东西,我希望能够“做些什么“与响应代码。我还创建了一个包含我的示例代码的简单回购。你可以找到它here

+0

我完全不明白你的意思,但如果你想记录的响应代码,并有一个这样的输出:'2017年2月10日17时25分48秒127.0.0.1:63747 [/ foo] 405 1915.059μs'你可以尝试violetear - https://violetear.org/ – nbari

+0

我的目标是向另一个服务报告http响应代码(具体来说:statds)。所以我需要某种机制从所有处理程序中提取响应代码并将它们发送给statds。 –

+0

复制LoggingHandler的功能:创建满足“http.ResponseWriter”接口的自己的类型,并在“Write”方法中记录/检查您需要的内容。 – elithrar

这是如何将其与violetear进行,也许可以给你一个关于如何处理程序中处理状态代码提示:

package main 

import (
    "fmt" 
    "log" 
    "net/http" 

    "github.com/nbari/violetear" 
) 

func handleGET(w http.ResponseWriter, r *http.Request) { 
    w.Write([]byte("I handle GET requests\n")) 
    // do anything here with the Status code 
    cw := w.(*violetear.ResponseWriter) 
    fmt.Printf("The status code is: %d\n", cw.Status()) 
} 

func main() { 
    router := violetear.New() 
    router.HandleFunc("/", handleGET, "GET") 
    log.Fatal(http.ListenAndServe(":8080", router)) 
} 

使用:

cw := w.(*violetear.ResponseWriter) 

你可以通过使用cw.Status()

访问violetear.ResponseWriter公开的状态代码您可以编写自己的中间件,这里是一个非常b ASE例如

package main 

import (
    "log" 
    "net/http" 

    "github.com/gorilla/mux" 
    "github.com/rogierlommers/mux-status-handler/articles" 
    "github.com/rogierlommers/mux-status-handler/users" 
) 

// middleWare ... 
func middleWare(handler http.Handler) http.Handler { 
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
     // right not all this does is log like 
     // "github.com/gorilla/handlers" 
     log.Printf("%s %s %s", r.RemoteAddr, r.Method, r.URL) 
     // However since this is middleware you can have it do other things 
     // Examples, auth users, write to file, redirects, handle panics, ect 
     // add code to log to statds, remove log.Printf if you want 


     handler.ServeHTTP(w, r) 
    }) 
} 

func main() { 
    r := mux.NewRouter() 
    r.HandleFunc("/products", articles.Handler) 
    r.HandleFunc("/users", users.Handler) 

    log.Println("listening on 8080") 
    http.ListenAndServe(":8080", middleWare(r)) 
}