1365da141879970fac1b6b353ce2001872aee1ff
slog: Gin middleware
Gin middleware to log http requests using slog.
See also:
- slog-multi:
slog.Handlerchaining, fanout, routing, failover, load balancing... - slog-formatter:
slogattribute formatting - slog-gin: Gin middleware for
sloglogger - slog-echo: Echo middleware for
sloglogger - slog-fiber: Fiber 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
🚀 Install
go get github.com/samber/slog-gin
Compatibility: go >= 1.20.3
This library is v0 and follows SemVer strictly. On slog final release (go 1.21), this library will go v1.
No breaking changes will be made to exported APIs before v1.0.0.
💡 Usage
Minimal
import (
"github.com/gin-gonic/gin"
sloggin "github.com/samber/slog-gin"
"golang.org/x/exp/slog"
)
// Create a slog logger, which:
// - Logs to stdout.
logger := slog.New(slog.NewTextHandler(os.Stdout))
router := gin.New()
// Add the sloggin middleware to all routes.
// The middleware will log all requests attributes.
router.Use(sloggin.New(logger))
// Example pong request.
router.GET("/pong", func(c *gin.Context) {
c.String(http.StatusOK, "pong")
})
router.Run(":1234")
// output:
// time=2023-04-10T14:00:0.000000Z level=INFO msg="Incoming request" status=200 method=GET path=/pong ip=127.0.0.1 latency=25.5µs user-agent=curl/7.77.0 time=2023-04-10T14:00:00.000Z
Using custom time formatters
import (
"github.com/gin-gonic/gin"
sloggin "github.com/samber/slog-gin"
slogformatter "github.com/samber/slog-formatter"
"golang.org/x/exp/slog"
)
// 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.DateTime, nil),
)(
slog.NewTextHandler(os.Stdout),
),
)
router := gin.New()
// Add the sloggin middleware to all routes.
// The middleware will log all requests attributes.
router.Use(sloggin.New(logger))
// Example pong request.
router.GET("/pong", func(c *gin.Context) {
c.String(http.StatusOK, "pong")
})
router.Run(":1234")
// output:
// time="2023-04-10 14:00:00" level=INFO msg="Incoming request" status=200 method=GET path=/pong ip=127.0.0.1 latency=25.5µs user-agent=curl/7.77.0 time="2023-04-10 14:00:00"
Using custom logger sub-group
import (
"github.com/gin-gonic/gin"
sloggin "github.com/samber/slog-gin"
"golang.org/x/exp/slog"
)
// Create a slog logger, which:
// - Logs to stdout.
logger := slog.New(slog.NewTextHandler(os.Stdout))
router := gin.New()
// Add the sloggin middleware to all routes.
// The middleware will log all requests attributes under a "http" group.
router.Use(sloggin.New(logger.WithGroup("http")))
// Example pong request.
router.GET("/pong", func(c *gin.Context) {
c.String(http.StatusOK, "pong")
})
router.Run(":1234")
// output:
// time=2023-04-10T14:00:0.000000+02:00 level=INFO msg="Incoming request" http.status=200 http.method=GET http.path=/pong http.ip=127.0.0.1 http.latency=20.125µs http.user-agent=curl/7.77.0 time=2023-04-10T14:00:00.000+02:00
Add logger to a single route
import (
"github.com/gin-gonic/gin"
sloggin "github.com/samber/slog-gin"
"golang.org/x/exp/slog"
)
// Create a slog logger, which:
// - Logs to stdout.
logger := slog.New(slog.NewTextHandler(os.Stdout))
router := gin.New()
// Example pong request.
// Add the sloggin middleware to a single routes.
router.GET("/pong", sloggin.New(logger), func(c *gin.Context) {
c.String(http.StatusOK, "pong")
})
router.Run(":1234")
// output:
// time="2023-04-10 14:00:00" level=INFO msg="Incoming request" status=200 method=GET path=/pong ip=127.0.0.1 latency=25.5µs user-agent=curl/7.77.0 time="2023-04-10 14:00:00"
Adding custom attributes
import (
"github.com/gin-gonic/gin"
sloggin "github.com/samber/slog-gin"
"golang.org/x/exp/slog"
)
// Create a slog logger, which:
// - Logs to stdout.
logger := slog.New(slog.NewTextHandler(os.Stdout)).
With("environment", "production").
With("server", "gin/1.9.0").
With("server_start_time", time.Now()).
With("gin_mode", gin.EnvGinMode)
router := gin.New()
// Add the sloggin middleware to all routes.
// The middleware will log all requests attributes.
router.Use(sloggin.New(logger))
// Example pong request.
router.GET("/pong", func(c *gin.Context) {
c.String(http.StatusOK, "pong")
})
router.Run(":1234")
// output:
// time=2023-04-10T14:00:0.000000+02:00 level=INFO msg="Incoming request" environment=production server=gin/1.9.0 gin_mode=release server_start_time=2023-04-10T10:00:00.000+02:00 status=200 method=GET path=/pong ip=127.0.0.1 latency=25.5µs user-agent=curl/7.77.0 time=2023-04-10T14:00:00.000+02:00
JSON output
import (
"github.com/gin-gonic/gin"
sloggin "github.com/samber/slog-gin"
"golang.org/x/exp/slog"
)
// Create a slog logger, which:
// - Logs to stdout.
logger := slog.New(slog.NewJSONHandler(os.Stdout))
router := gin.New()
// Add the sloggin middleware to all routes.
// The middleware will log all requests attributes.
router.Use(sloggin.New(logger))
// Example pong request.
router.GET("/pong", func(c *gin.Context) {
c.String(http.StatusOK, "pong")
})
router.Run(":1234")
// output:
// {"time":"2023-04-10T14:00:0.000000+02:00","level":"INFO","msg":"Incoming request","gin_mode":"GIN_MODE","status":200,"method":"GET","path":"/pong","ip":"127.0.0.1","latency":15542,"user-agent":"curl/7.77.0","time":"2023-04-10T14:00:0.000000+02:00"}
🤝 Contributing
- 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-test
👤 Contributors
💫 Show your support
Give a ⭐️ if this project helped you!
📝 License
Copyright © 2023 Samuel Berthe.
This project is MIT licensed.
Description
Languages
Go
93.7%
Makefile
6.3%