echoでログを出力するには、公式ドキュメントではmiddleware.Logger()
と記載されている。
middleware#Logger
main.go
package main
import (
"net/http"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
)
func main() {
// Echo instance
e := echo.New()
// Middleware
e.Use(middleware.Logger())
e.Use(middleware.Recover())
// Routes
e.GET("/", hello)
// Start server
e.Logger.Fatal(e.Start(":1323"))
}
// Handler
func hello(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!")
}
middleware.Logger()でのデフォルトの出力先はos.Stdoutなのでコンソールに出力される。
hoge.go
DefaultLoggerConfig = LoggerConfig{
Skipper: DefaultSkipper,
Format: `{"time":"${time_rfc3339_nano}","id":"${id}","remote_ip":"${remote_ip}","host":"${host}",` +
`"method":"${method}","uri":"${uri}","status":${status},"error":"${error}","latency":${latency},` +
`"latency_human":"${latency_human}","bytes_in":${bytes_in},` +
`"bytes_out":${bytes_out}}` + "\n",
Output: os.Stdout
}
ファイルに出力するにはos.OpenFile()の戻り値をOutput
に指定する。
os.OpenFile()
の引数は以下を指定する。
- ファイル名・・・日付を含むファイル名を指定する。
- 操作方法・・・
os.O_RDWR|os.O_CREATE
(読み書き可能かつ、存在しない場合は新規作成する) - パーミッション・・・0664
main.go
package main
import (
"net/http"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
)
func main() {
// Echo instance
e := echo.New()
// Middleware
today := time.Now()
logfilename := "/log/app-" + today.Format("20060102") + ".log"
log, err := os.OpenFile(logfilename, os.O_RDWR|os.O_CREATE, 0664)
if err != nil {
return e
}
e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{
Output: log,
}))
e.Use(middleware.Recover())
// Routes
e.GET("/", hello)
// Start server
e.Logger.Fatal(e.Start(":1323"))
}
// Handler
func hello(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!")
}
簡易的だがechoの起動日単位でログファイルをローテションできる。
サービスを止めないでログをローテーションする方法を次は考えておきたい。