Fiber middleware to log http requests using slog.
See also:
- slog-multi:
slog.Handlerchaining, fanout, routing, failover, load balancing... - slog-formatter:
slogattribute formatting - slog-sampling:
slogsampling policy - slog-gin: Gin middleware for
sloglogger - slog-echo: Echo middleware for
sloglogger - slog-fiber: Fiber middleware for
sloglogger - slog-chi: Chi middleware for
sloglogger - slog-datadog: A
sloghandler forDatadog - slog-rollbar: A
sloghandler forRollbar - slog-sentry: A
sloghandler forSentry - slog-syslog: A
sloghandler forSyslog - slog-logstash: A
sloghandler forLogstash - slog-fluentd: A
sloghandler forFluentd - slog-graylog: A
sloghandler forGraylog - slog-loki: A
sloghandler forLoki - slog-slack: A
sloghandler forSlack - slog-telegram: A
sloghandler forTelegram - slog-mattermost: A
sloghandler forMattermost - slog-microsoft-teams: A
sloghandler forMicrosoft Teams - slog-webhook: A
sloghandler forWebhook - slog-kafka: A
sloghandler forKafka - slog-parquet: A
sloghandler forParquet+Object Storage - slog-zap: A
sloghandler forZap - slog-zerolog: A
sloghandler forZerolog - slog-logrus: A
sloghandler forLogrus
go get github.com/samber/slog-fiberCompatibility: go >= 1.21
No breaking changes will be made to exported APIs before v2.0.0.
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/recover"
slogfiber "github.com/samber/slog-fiber"
"log/slog"
)
// Create a slog logger, which:
// - Logs to stdout.
logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
app := fiber.New()
app.Use(slogfiber.New(logger))
app.Use(recover.New())
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Hello, World π!")
})
app.Listen(":4242")
// output:
// time=2023-04-10T14:00:00.000+00:00 level=INFO msg="Incoming request" status=200 method=GET path=/ route=/ ip=::1 latency=25.958Β΅s user-agent=curl/7.77.0 time=2023-04-10T14:00:00.000+00:00 request-id=229c7fc8-64f5-4467-bc4a-940700503b0dlogger := slog.New(slog.NewTextHandler(os.Stdout, nil))
config := sloggin.Config{
WithRequestBody: true,
WithResponseBody: true,
WithRequestHeader: true,
WithResponseHeader: true,
}
app := fiber.New()
app.Use(slogfiber.NewWithConfig(logger, config))logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
app := fiber.New()
app.Use(
slogfiber.NewWithFilters(
logger,
slogfiber.Accept(func (c *fiber.Ctx) bool {
return xxx
}),
slogfiber.IgnoreStatus(401, 404),
),
)
app.Use(recover.New())Available filters:
- Accept / Ignore
- AcceptMethod / IgnoreMethod
- AcceptStatus / IgnoreStatus
- AcceptStatusGreaterThan / IgnoreStatusLessThan
- AcceptStatusGreaterThanOrEqual / IgnoreStatusLessThanOrEqual
- AcceptPath / IgnorePath
- AcceptPathContains / IgnorePathContains
- AcceptPathPrefix / IgnorePathPrefix
- AcceptPathSuffix / IgnorePathSuffix
- AcceptPathMatch / IgnorePathMatch
- AcceptHost / IgnoreHost
- AcceptHostContains / IgnoreHostContains
- AcceptHostPrefix / IgnoreHostPrefix
- AcceptHostSuffix / IgnoreHostSuffix
- AcceptHostMatch / IgnoreHostMatch
// Create a slog logger, which:
// - Logs to stdout.
// - RFC3339 with UTC time format.
logger := slog.New(
slogformatter.NewFormatterHandler(
slogformatter.TimezoneConverter(time.UTC),
slogformatter.TimeFormatter(time.RFC3339, nil),
)(
slog.NewTextHandler(os.Stdout, nil),
),
)
app := fiber.New()
app.Use(slogfiber.New(logger))
app.Use(recover.New())
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Hello, World π!")
})
app.Listen(":4242")
// output:
// time=2023-04-10T14:00:00.000+00:00 level=INFO msg="Incoming request" status=200 method=GET path=/ route=/ ip=::1 latency=25.958Β΅s user-agent=curl/7.77.0 time=2023-04-10T14:00:00Z request-id=229c7fc8-64f5-4467-bc4a-940700503b0dlogger := slog.New(slog.NewTextHandler(os.Stdout, nil))
app := fiber.New()
app.Use(slogfiber.New(logger.WithGroup("http")))
app.Use(recover.New())
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Hello, World π!")
})
app.Listen(":4242")
// output:
// time=2023-04-10T14:00:00.000+00:00 level=INFO msg="Incoming request" http.status=200 http.method=GET http.path=/ http.route=/ http.ip=::1 http.latency=25.958Β΅s http.user-agent=curl/7.77.0 http.time=2023-04-10T14:00:00Z http.request-id=229c7fc8-64f5-4467-bc4a-940700503b0dlogger := slog.New(slog.NewTextHandler(os.Stdout, nil))
app := fiber.New()
app.Use(slogfiber.New(logger))
app.Use(recover.New())
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Hello, World π!")
})
app.Listen(":4242")
// output:
// time=2023-04-10T14:00:00.000+00:00 level=INFO msg="Incoming request" status=200 method=GET path=/ route=/ ip=::1 latency=25.958Β΅s user-agent=curl/7.77.0 time=2023-04-10T14:00:00Z request-id=229c7fc8-64f5-4467-bc4a-940700503b0dlogger := slog.New(slog.NewTextHandler(os.Stdout, nil))
// Add an attribute to all log entries made through this logger.
logger = logger.With("env", "production")
app := fiber.New()
app.Use(slogfiber.New(logger))
app.Use(recover.New())
app.Get("/", func(c *fiber.Ctx) error {
// Add an attribute to a single log entry.
slogfiber.AddCustomAttributes(c, slog.String("foo", "bar"))
return c.SendString("Hello, World π!")
})
app.Listen(":4242")
// output:
// time=2023-04-10T14:00:00.000+00:00 level=INFO msg="Incoming request" env=production status=200 method=GET path=/ route=/ ip=::1 latency=25.958Β΅s user-agent=curl/7.77.0 time=2023-04-10T14:00:00Z request-id=229c7fc8-64f5-4467-bc4a-940700503b0d foo=barlogger := slog.New(slog.NewJSONHandler(os.Stdout, nil)),
app := fiber.New()
app.Use(slogfiber.New(logger))
app.Use(recover.New())
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Hello, World π!")
})
app.Listen(":4242")
// output:
// {"time":"2023-04-10T14:00:00Z","level":"INFO","msg":"Incoming request","status":200,"method":"GET","path":"/","ip":"::1","latency":26750,"user-agent":"curl/7.77.0","time":"2023-04-10T14:00:00Z","request-id":"04201917-d7ba-4b20-a3bb-2fffba5f2bd9"}- Ping me on twitter @samuelberthe (DMs, mentions, whatever :))
- Fork the project
- Fix open issues or request new features
Don't hesitate ;)
# Install some dev dependencies
make tools
# Run tests
make test
# or
make watch-testGive a βοΈ if this project helped you!
Copyright Β© 2023 Samuel Berthe.
This project is MIT licensed.