Documentation ¶
Overview ¶
Package hlog provides a set of http.Handler helpers for zerolog.
Example (Handler) ¶
//go:build !binary_log // +build !binary_log package main import ( "net/http" "os" "time" "net/http/httptest" "github.com/rs/zerolog" "github.com/rs/zerolog/hlog" ) // fake alice to avoid dep type middleware func(http.Handler) http.Handler type alice struct { m []middleware } func (a alice) Append(m middleware) alice { a.m = append(a.m, m) return a } func (a alice) Then(h http.Handler) http.Handler { for i := range a.m { h = a.m[len(a.m)-1-i](h) } return h } func init() { zerolog.TimestampFunc = func() time.Time { return time.Date(2001, time.February, 3, 4, 5, 6, 7, time.UTC) } } func main() { log := zerolog.New(os.Stdout).With(). Timestamp(). Str("role", "my-service"). Str("host", "local-hostname"). Logger() c := alice{} // Install the logger handler with default output on the console c = c.Append(hlog.NewHandler(log)) // Install some provided extra handlers to set some request's context fields. // Thanks to those handlers, all our logs will come with some pre-populated fields. c = c.Append(hlog.RemoteAddrHandler("ip")) c = c.Append(hlog.UserAgentHandler("user_agent")) c = c.Append(hlog.RefererHandler("referer")) //c = c.Append(hlog.RequestIDHandler("req_id", "Request-Id")) // Here is your final handler h := c.Then(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // Get the logger from the request's context. You can safely assume it // will be always there: if the handler is removed, hlog.FromRequest // will return a no-op logger. hlog.FromRequest(r).Info(). Str("user", "current user"). Str("status", "ok"). Msg("Something happened") })) http.Handle("/", h) h.ServeHTTP(httptest.NewRecorder(), &http.Request{}) }
Output: {"level":"info","role":"my-service","host":"local-hostname","user":"current user","status":"ok","time":"2001-02-03T04:05:06Z","message":"Something happened"}
Index ¶
- func AccessHandler(f func(r *http.Request, status, size int, duration time.Duration)) func(next http.Handler) http.Handler
- func CtxWithID(ctx context.Context, id xid.ID) context.Context
- func CustomHeaderHandler(fieldKey, header string) func(next http.Handler) http.Handler
- func EtagHandler(fieldKey string) func(next http.Handler) http.Handler
- func FromRequest(r *http.Request) *zerolog.Logger
- func HTTPVersionHandler(fieldKey string) func(next http.Handler) http.Handler
- func HostHandler(fieldKey string, trimPort ...bool) func(next http.Handler) http.Handler
- func IDFromCtx(ctx context.Context) (id xid.ID, ok bool)
- func IDFromRequest(r *http.Request) (id xid.ID, ok bool)
- func MethodHandler(fieldKey string) func(next http.Handler) http.Handler
- func NewHandler(log zerolog.Logger) func(http.Handler) http.Handler
- func ProtoHandler(fieldKey string) func(next http.Handler) http.Handler
- func RefererHandler(fieldKey string) func(next http.Handler) http.Handler
- func RemoteAddrHandler(fieldKey string) func(next http.Handler) http.Handler
- func RemoteIPHandler(fieldKey string) func(next http.Handler) http.Handler
- func RequestHandler(fieldKey string) func(next http.Handler) http.Handler
- func RequestIDHandler(fieldKey, headerName string) func(next http.Handler) http.Handler
- func ResponseHeaderHandler(fieldKey, headerName string) func(next http.Handler) http.Handler
- func URLHandler(fieldKey string) func(next http.Handler) http.Handler
- func UserAgentHandler(fieldKey string) func(next http.Handler) http.Handler
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func AccessHandler ¶
func AccessHandler(f func(r *http.Request, status, size int, duration time.Duration)) func(next http.Handler) http.Handler
AccessHandler returns a handler that call f after each request.
func CustomHeaderHandler ¶
CustomHeaderHandler adds given header from request's header as a field to the context's logger using fieldKey as field key.
func EtagHandler ¶
EtagHandler adds Etag header from response's header as a field to the context's logger using fieldKey as field key.
func FromRequest ¶
FromRequest gets the logger in the request's context. This is a shortcut for log.Ctx(r.Context())
func HTTPVersionHandler ¶
HTTPVersionHandler is similar to ProtoHandler, but it does not store the "HTTP/" prefix in the protocol name.
func HostHandler ¶
HostHandler adds the request's host as a field to the context's logger using fieldKey as field key. If trimPort is set to true, then port is removed from the host.
func IDFromRequest ¶
IDFromRequest returns the unique id associated to the request if any.
func MethodHandler ¶
MethodHandler adds the request method as a field to the context's logger using fieldKey as field key.
func NewHandler ¶
NewHandler injects log into requests context.
func ProtoHandler ¶
ProtoHandler adds the requests protocol version as a field to the context logger using fieldKey as field Key.
func RefererHandler ¶
RefererHandler adds the request's referer as a field to the context's logger using fieldKey as field key.
func RemoteAddrHandler ¶
RemoteAddrHandler adds the request's remote address as a field to the context's logger using fieldKey as field key.
func RemoteIPHandler ¶
RemoteIPHandler is similar to RemoteAddrHandler, but logs only an IP, not a port.
func RequestHandler ¶
RequestHandler adds the request method and URL as a field to the context's logger using fieldKey as field key.
func RequestIDHandler ¶
RequestIDHandler returns a handler setting a unique id to the request which can be gathered using IDFromRequest(req). This generated id is added as a field to the logger using the passed fieldKey as field name. The id is also added as a response header if the headerName is not empty.
The generated id is a URL safe base64 encoded mongo object-id-like unique id. Mongo unique id generation algorithm has been selected as a trade-off between size and ease of use: UUID is less space efficient and snowflake requires machine configuration.
func ResponseHeaderHandler ¶
func URLHandler ¶
URLHandler adds the requested URL as a field to the context's logger using fieldKey as field key.
Types ¶
This section is empty.