Giter Site home page Giter Site logo

griggsca91 / slog-fiber Goto Github PK

View Code? Open in Web Editor NEW

This project forked from samber/slog-fiber

0.0 0.0 0.0 42 KB

๐Ÿšจ Fiber middleware for slog logger

Home Page: https://pkg.go.dev/github.com/samber/slog-fiber

License: MIT License

Go 92.33% Makefile 7.67%

slog-fiber's Introduction

slog: Fiber middleware

tag Go Version GoDoc Build Status Go report Coverage Contributors License

Fiber middleware to log http requests using slog.

See also:

๐Ÿš€ Install

go get github.com/samber/slog-fiber

Compatibility: go >= 1.21

No breaking changes will be made to exported APIs before v2.0.0.

๐Ÿ’ก Usage

Minimal

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-940700503b0d

Verbose

logger := 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))

Filters

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

Using custom time formatters

// 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-940700503b0d

Using custom logger sub-group

logger := 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-940700503b0d

Add logger to a single route

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:00Z request-id=229c7fc8-64f5-4467-bc4a-940700503b0d

Adding custom attributes

logger := 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=bar

JSON output

logger := 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"}

๐Ÿค Contributing

Don't hesitate ;)

# Install some dev dependencies
make tools

# Run tests
make test
# or
make watch-test

๐Ÿ‘ค Contributors

Contributors

๐Ÿ’ซ Show your support

Give a โญ๏ธ if this project helped you!

GitHub Sponsors

๐Ÿ“ License

Copyright ยฉ 2023 Samuel Berthe.

This project is MIT licensed.

slog-fiber's People

Contributors

samber avatar dependabot[bot] avatar sandrolain avatar usysrc avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.