Add middleware to include the request ID in all logs.

This commit is contained in:
mikestefanello 2021-12-08 21:55:30 -05:00
parent 4096691df0
commit 26e456eae3
5 changed files with 28 additions and 10 deletions

View file

@ -99,12 +99,11 @@ func (t *Controller) cachePage(c echo.Context, p Page, html *bytes.Buffer) {
} }
err := marshaler.New(t.Container.Cache).Set(c.Request().Context(), key, cp, opts) err := marshaler.New(t.Container.Cache).Set(c.Request().Context(), key, cp, opts)
if err != nil { if err != nil {
c.Logger().Errorf("failed to cache page: %s", key) c.Logger().Errorf("failed to cache page: %v", err)
c.Logger().Error(err)
return return
} }
c.Logger().Infof("cached page for: %s", key) c.Logger().Infof("cached page")
} }
func (t *Controller) parsePageTemplates(p Page) error { func (t *Controller) parsePageTemplates(p Page) error {

View file

@ -35,6 +35,7 @@ func BuildRouter(c *container.Container) {
echomw.Recover(), echomw.Recover(),
echomw.Gzip(), echomw.Gzip(),
echomw.Logger(), echomw.Logger(),
middleware.LogRequestID(),
echomw.TimeoutWithConfig(echomw.TimeoutConfig{ echomw.TimeoutWithConfig(echomw.TimeoutConfig{
Timeout: c.Config.App.Timeout, Timeout: c.Config.App.Timeout,
}), }),

View file

@ -45,6 +45,7 @@ func HasField(v interface{}, name string) bool {
// File appends a cache key to a given filepath so it can remain cached until the app is restarted // File appends a cache key to a given filepath so it can remain cached until the app is restarted
func File(filepath string) string { func File(filepath string) string {
// TODO: Use const for path prefix
return fmt.Sprintf("/files/%s?v=%s", filepath, CacheKey) return fmt.Sprintf("/files/%s?v=%s", filepath, CacheKey)
} }

View file

@ -20,21 +20,19 @@ type CachedPage struct {
func PageCache(ch *cache.Cache) echo.MiddlewareFunc { func PageCache(ch *cache.Cache) echo.MiddlewareFunc {
return func(next echo.HandlerFunc) echo.HandlerFunc { return func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error { return func(c echo.Context) error {
key := c.Request().URL.String() res, err := marshaler.New(ch).Get(c.Request().Context(), c.Request().URL.String(), new(CachedPage))
res, err := marshaler.New(ch).Get(c.Request().Context(), key, new(CachedPage))
if err != nil { if err != nil {
if err == redis.Nil { if err == redis.Nil {
c.Logger().Infof("no cached page for: %s", key) c.Logger().Infof("no cached page found")
} else { } else {
c.Logger().Errorf("failed getting cached page: %s", key) c.Logger().Errorf("failed getting cached page: %v", err)
c.Logger().Error(err)
} }
return next(c) return next(c)
} }
page, ok := res.(*CachedPage) page, ok := res.(*CachedPage)
if !ok { if !ok {
c.Logger().Errorf("failed casting cached page: %s", key) c.Logger().Errorf("failed casting cached page")
return next(c) return next(c)
} }
@ -43,7 +41,7 @@ func PageCache(ch *cache.Cache) echo.MiddlewareFunc {
c.Response().Header().Set(k, v) c.Response().Header().Set(k, v)
} }
} }
c.Logger().Infof("serving cached page for: %s", key) c.Logger().Infof("serving cached page")
return c.HTMLBlob(page.StatusCode, page.HTML) return c.HTMLBlob(page.StatusCode, page.HTML)
} }

19
middleware/log.go Normal file
View file

@ -0,0 +1,19 @@
package middleware
import (
"fmt"
"github.com/labstack/echo/v4"
)
// LogRequestID includes the request ID in all logs for the given request
func LogRequestID() echo.MiddlewareFunc {
return func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
rid := c.Response().Header().Get(echo.HeaderXRequestID)
format := fmt.Sprintf(`{"time":"${time_rfc3339_nano}","id":"%s","level":"${level}","prefix":"${prefix}","file":"${short_file}","line":"${line}"}`, rid)
c.Logger().SetHeader(format)
return next(c)
}
}
}