2016-07-18 22 views
1

私はGoとGorilla Webツールキットのマルチプレクサとハンドラパッケージを使用して、複雑なアプリケーションを構築しています。その一部にはhttpサーバが必要です。 Gorillaのマルチプレクサとハンドラパッケージはすばらしく動作し、httpサーバを正常に稼働させることができ、リクエストを記録するのは非常に簡単です。ゴールログhttp応答(リクエストに加えて)

しかし、私はどのように応答を記録するのか判断できません。理想的には、GorillaのLoggingHandlerと同様のメカニズムを使用して、ロギング・メカニズムを簡単に「ラップ」したいと考えています。

応答を簡単に折り返し/記録するGolangパッケージはありますか?私が考慮していないこのような方法でGoまたはGorillaの機能を使用する方法はありますか?

答えて

3

おかげさまで、ありがとうございました。私はいくつかの提案を試して、ミニマリストのラッパーを使用するやや単純なソリューションに着いた。ここでは私のために働いたソリューションは、(、いっその他のソリューションを、コメントを提供すること自由に感じ、か)である:

import (
    "fmt" 
    "log" 
    "net/http" 
    "net/http/httptest" 
    "net/http/httputil" 
    "github.com/gorilla/mux" 
) 
: 

func logHandler(fn http.HandlerFunc) http.HandlerFunc { 
    return func(w http.ResponseWriter, r *http.Request) { 
     x, err := httputil.DumpRequest(r, true) 
     if err != nil { 
      http.Error(w, fmt.Sprint(err), http.StatusInternalServerError) 
      return 
     } 
     log.Println(fmt.Sprintf("%q", x)) 
     rec := httptest.NewRecorder() 
     fn(rec, r) 
     log.Println(fmt.Sprintf("%q", rec.Body))    
    } 
} 

func MessageHandler(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintln(w, "A message was received") 
} 

、次のコードは、前述のハンドラを使用します:

: 
router := mux.NewRouter() 
router.HandleFunc("/", logHandler(MessageHandler)) 
: 

出力から上記のコードは、次の行に沿ったものになります。

: 
2016/07/20 14:44:29 "GET ... HTTP/1.1\r\nHost: localhost:8088\r\nAccept: */*\r\nUser-Agent: curl/7.43.0\r\n\r\n" 
2016/07/20 14:44:29 ...[response body] 
: 
2

編集申し訳ありませんが、私はgorilla-muxのあなたの言及に気付きませんでしたが、私はジンでこれを試しましたが、ミドルウェアを使用してもこれは動作するはずです。後続のすべてのミドルウェアが戻るまで


トリックは、ミドルウェアブロックでc.Next()です。ここにlogrusの解決策があります。あなたの最初のミドルウェアとしてこれを入れよう:

func Logrus(logger *logrus.Logger) gin.HandlerFunc { 
    return func(c *gin.Context) { 
     start := time.Now().UTC() 
     path := c.Request.URL.Path 
     c.Next() 
     end := time.Now().UTC() 
     latency := end.Sub(start) 
     logger.WithFields(logrus.Fields{ 
      "status":  c.Writer.Status(), 
      "method":  c.Request.Method, 
      "path":  path, 
      "ip":   c.ClientIP(), 
      "duration": latency, 
      "user_agent": c.Request.UserAgent(), 
     }).Info() 
    } 
} 
GinEngine.Use(Logger(logrus.StandardLogger())) 
関連する問題