Skip to content
Snippets Groups Projects
log_middlewares.go 1.05 KiB
Newer Older
package orusapi

import (
	"net/http"
	"time"

	"github.com/justinas/alice"
	"github.com/rs/zerolog"
	"github.com/rs/zerolog/hlog"
)

// LogStack ...
func LogStack(log zerolog.Logger, status4XXLogLevel zerolog.Level) []alice.Constructor {
	return []alice.Constructor{
		hlog.NewHandler(log),
		CatchPanics,
		hlog.RemoteAddrHandler("ip"),
		hlog.UserAgentHandler("user_agent"),
		hlog.RefererHandler("referer"),
		hlog.RequestIDHandler("req_id", "Request-Id"),
		hlog.AccessHandler(func(r *http.Request, status, size int, duration time.Duration) {
			log := hlog.FromRequest(r)
			var event *zerolog.Event
Axel Prel's avatar
Axel Prel committed
			//nolint:zerologlint
			switch {
			case status >= http.StatusInternalServerError:
				event = log.Error()
Axel Prel's avatar
Axel Prel committed
			case status >= http.StatusBadRequest:
				event = log.WithLevel(status4XXLogLevel)
Axel Prel's avatar
Axel Prel committed
			default:
				event = log.Info()
			}
			event.
				Dict("request", zerolog.Dict().
					Str("method", r.Method).
					Str("url", r.URL.String())).
				Int("status", status).
				Int("size", size).
				Dur("duration", duration).
				Msg(http.StatusText(status))
		}),
	}
}