今回は、echoフレームワークでリクエスト・レスポンスを出力する際にBodyDumpWithConfigを利用した方法について、記載したいと思います。

echoフレームワークとは

echoは拡張性が高くハイパフォーマンスなWebフレームワークです。公式のドキュメントもしっかりしています。Web開発でよく利用するような様々なミドルウェアも提供されている便利なフレームワークです。

コード

BodyDumpWithConfigを利用しない方法は、従来のWrapして上げて表示するパターンです。これは、echoフレームワークとかは、あまり関係なくnet/httpなどでも同じことができます。下記サンプルでは、echoのmiddlewareとして実装しています。


package main

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

    "github.com/labstack/echo"
    "github.com/labstack/echo/middleware"
)

func main() {
    e := echo.New()
    e.Use(func (next echo.HandlerFunc) echo.HandlerFunc {
        return func(c echo.Context) error {
            log.Printf("Request: %+v\n", c.Request())
            err := next(c)
            log.Printf("Request: %+v\n", c.Response())
            return err
        }
    })

    e.GET("/", func(c echo.Context) error {
        value := c.QueryParam("message")
        return c.String(http.StatusOK, fmt.Sprintf("Hello, %v!", value))
    })
    e.Logger.Fatal(e.Start(":1323"))
}


package main

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

    "github.com/labstack/echo"
    "github.com/labstack/echo/middleware"
)

func main() {
    e := echo.New()
    e.Use(middleware.BodyDumpWithConfig(middleware.BodyDumpConfig{
        Skipper: func (c echo.Context) bool {
            if _, ok := c.Request().Header["Debug"]; ok {
                return false
            }
            return true
        },
        Handler: func(c echo.Context, reqBody, resBody []byte) {
            log.Printf("Request[%+v], Response[%+v]", string(reqBody), string(resBody))
        },
    }))

    e.GET("/", func(c echo.Context) error {
        value := c.QueryParam("message")
        return c.String(http.StatusOK, fmt.Sprintf("Hello, %v!", value))
    })
    e.Logger.Fatal(e.Start(":1323"))
}


BodyDumpConfigを使った場合は、下記のようになります。
Skipper、Handlerをつかって制御をします。Skipperは、Handler処理をスキップする条件を書きます。下記サンプルでは、リクエストヘッダーに”Debug”が含まれる場合のみ、リクエスト・レスポンスの出力をするという設定です。

このような形にしておくとリクエスト・レスポンスでのログ出力をするためにバイナリを作成しなおす必要がないのがメリットです。

echoフレームワークをうまく使って上げると初期開発は、サクッと済みそうでね。