logginghandler/logginghandler.go

59 lines
1.5 KiB
Go
Raw Normal View History

2021-01-18 11:46:22 +01:00
// Package logginghandler is a simple, zerolog based, request logging http middleware.
// It also sets `X-Request-ID` in the request and response headers.
2020-10-13 15:26:40 +02:00
package logginghandler
import (
"context"
2020-10-13 15:26:40 +02:00
"net/http"
"time"
2020-10-13 15:26:40 +02:00
"github.com/justinas/alice"
2020-10-13 15:26:40 +02:00
"github.com/rs/zerolog"
"github.com/rs/zerolog/hlog"
"github.com/rs/zerolog/log"
2020-10-13 15:26:40 +02:00
)
2021-01-18 11:46:22 +01:00
// GetUUID gets the requests UUID from a request.
func GetUUID(r *http.Request) (string, bool) {
uuid, ok := hlog.IDFromRequest(r)
if !ok {
return "", false
}
return uuid.String(), true
2020-10-13 15:26:40 +02:00
}
// FromRequest returns a logger with the UUID set from request.
func FromRequest(r *http.Request) zerolog.Logger {
return *hlog.FromRequest(r)
2020-10-13 15:26:40 +02:00
}
// FromCtx returns a logger with the UUID set from ctx.
func FromCtx(ctx context.Context) zerolog.Logger {
return *log.Ctx(ctx)
}
func Handler(log zerolog.Logger) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
chain := alice.New(
hlog.NewHandler(log),
hlog.AccessHandler(func(r *http.Request, status, size int, duration time.Duration) {
hlog.FromRequest(r).Info().
Str("method", r.Method).
Str("proto", r.Proto).
Stringer("request-url", r.URL).
Int("status", status).
Int("size", size).
Dur("duration", duration).
Msg("")
}),
hlog.RemoteAddrHandler("remote"),
hlog.UserAgentHandler("user-agent"),
hlog.RefererHandler("referer"),
hlog.RequestIDHandler("uuid", "X-Request-ID"),
).Then(next)
return chain
}
2020-10-13 15:26:40 +02:00
}