From 8d599e5b79b964d37e0d7eadde14db41a924392b Mon Sep 17 00:00:00 2001 From: Alexandre Negrel Date: Wed, 10 Jan 2024 17:37:36 +0100 Subject: [PATCH] add logger middleware --- internal/middlewares/logger.go | 24 +++++++++++ internal/middlewares/logger_test.go | 67 +++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 internal/middlewares/logger.go create mode 100644 internal/middlewares/logger_test.go diff --git a/internal/middlewares/logger.go b/internal/middlewares/logger.go new file mode 100644 index 0000000..81f65de --- /dev/null +++ b/internal/middlewares/logger.go @@ -0,0 +1,24 @@ +package middlewares + +import ( + "github.com/gofiber/fiber/v2" + "github.com/prismelabs/prismeanalytics/internal/log" + "github.com/rs/zerolog" +) + +type LoggerKey struct{} + +func Logger(logger log.Logger) fiber.Handler { + appLogger := logger + return func(c *fiber.Ctx) error { + logger = appLogger + logger.UpdateContext(func(ctx zerolog.Context) zerolog.Context { + requestId := c.Locals(RequestIdKey{}).(string) + return ctx.Str("request_id", requestId) + }) + + c.Locals(LoggerKey{}, logger) + err := c.Next() + return err + } +} diff --git a/internal/middlewares/logger_test.go b/internal/middlewares/logger_test.go new file mode 100644 index 0000000..e5afd40 --- /dev/null +++ b/internal/middlewares/logger_test.go @@ -0,0 +1,67 @@ +package middlewares + +import ( + "bytes" + "io" + "net/http" + "net/http/httptest" + "testing" + + "github.com/gofiber/fiber/v2" + "github.com/prismelabs/prismeanalytics/internal/config" + "github.com/prismelabs/prismeanalytics/internal/log" + "github.com/stretchr/testify/require" +) + +func TestLogger(t *testing.T) { + t.Run("WithoutRequestIdMiddleware/Panics", func(t *testing.T) { + logger := log.NewLogger("app_log", io.Discard, false) + + app := fiber.New() + app.Use(func(c *fiber.Ctx) error { + require.Panics(t, func() { + c.Next() + }) + return nil + }) + app.Use(Logger(logger)) + app.Use(func(c *fiber.Ctx) error { + return nil + }) + + req := httptest.NewRequest(http.MethodGet, "/", nil) + + _, err := app.Test(req) + require.NoError(t, err) + }) + + t.Run("WithRequestIdMiddleware", func(t *testing.T) { + loggerOutput := bytes.Buffer{} + logger := log.NewLogger("app_log", &loggerOutput, false) + + app := fiber.New() + app.Use(RequestId(config.Server{})) + app.Use(Logger(logger)) + app.Use(func(c *fiber.Ctx) error { + logger := c.Locals(LoggerKey{}).(log.Logger) + logger.Info().Msg("hello from middleware") + return nil + }) + + req := httptest.NewRequest(http.MethodGet, "/hello", nil) + + _, err := app.Test(req) + require.NoError(t, err) + + actual := loggerOutput.String() + require.Regexp(t, `{"v":0,`+ + `"pid":\d+,`+ + `"hostname":"[^"]+",`+ + `"name":"app_log",`+ + `"request_id":"[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}",`+ + `"level":30,`+ + `"time":"((?:(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2}(?:\.\d+)?))(Z|[\+-]\d{2}:\d{2})?)",`+ + `"msg":"hello from middleware"}`, + actual) + }) +}