2017-02-10 2 views
1

Ich benutze Gorilla Mux für alle meine Routing. Jetzt funktioniert meine App gut, ich möchte einen Weg finden, alle meine Antwortcodes beispielsweise auf zu protokollieren. Ich habe dieses Paket gefunden: https://godoc.org/github.com/gorilla/handlers#LoggingHandlerGorilla Mux, der beste Weg, um Antwortcodes zu "fangen"

Das ermöglicht mir, alle Antworten in Apache-Format auszugeben. Obwohl das nett ist, ist es nicht 100% was ich will. Ich möchte nur extract die Antwort statusses und sende sie an Statds. Was ist der beste/einfachste Weg, dies zu erreichen?

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

Above Code gibt mir dies:

apache logformat output

Also ich suche etwas Ähnliches, aber stattdessen die Protokolle Apache Zugriff der Ausgabe an stdout, ich möchte ", um der Lage sein, mach etwas "mit dem Antwortcode. Ich habe auch ein einfaches Repo erstellt, das meinen Beispielcode enthält. Sie können es here finden.

+0

Ich weiß nicht genau verstehen, was Sie meinen, aber wenn Sie den Antwortcode anmelden, und eine Ausgabe wie folgt aus: '2017.02.10 17.25.48 127.0.0.1:63747 [/ foo] 405 19 15.059μs' könntest du violetear versuchen - https://violletear.org/ – nbari

+0

Mein Ziel ist es, HTTP-Antwortcodes an einen anderen Dienst zu melden (um genau zu sein: statds). Also brauche ich einen Mechanismus, der die Antwortcodes von allen Handlern extrahiert und an statds sendet. –

+0

Kopieren Sie, was der LoggingHandler tut: Erstellen Sie Ihren eigenen Typ, der die 'http.ResponseWriter'-Schnittstelle erfüllt, und protokollieren Sie bei der' Write'-Methode, was Sie benötigen. – elithrar

Antwort

0

Dies ist, wie kann es mit violetear, können Sie wahrscheinlich mit dem Statuscode innerhalb der Handler vorgenommen werden geben einen Hinweis darüber, wie zu behandeln:

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

Durch die Verwendung von:

cw := w.(*violetear.ResponseWriter) 

Sie kann auf den violetear.ResponseWriter zugreifen, der den Statuscode freigibt unter Verwendung cw.Status()

0

Sie können Ihre eigene Middleware schreiben, hier ist ein sehr b ase Beispiel

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)) 
} 
Verwandte Themen