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 //nolint:zerologlint switch { case status >= http.StatusInternalServerError: event = log.Error() case status >= http.StatusBadRequest: event = log.WithLevel(status4XXLogLevel) 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)) }), } }