hlog package - github.com/rs/zerolog/hlog - Go Packages
Package hlog provides a set of http.Handler helpers for zerolog.
//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"}
- 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
This section is empty.
This section is empty.
func AccessHandler ¶ added in v1.0.1
AccessHandler returns a handler that call f after each request.
CtxWithID adds the given xid.ID to the context
func CustomHeaderHandler ¶ added in v1.17.0
CustomHeaderHandler adds given header from request's header as a field to the context's logger using fieldKey as field key.
func EtagHandler ¶ added in v1.32.0
EtagHandler adds Etag header from response's header as a field to the context's logger using fieldKey as field key.
FromRequest gets the logger in the request's context. This is a shortcut for log.Ctx(r.Context())
func HTTPVersionHandler ¶ added in v1.32.0
HTTPVersionHandler is similar to ProtoHandler, but it does not store the "HTTP/" prefix in the protocol name.
func HostHandler ¶ added in v1.32.0
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.
IDFromCtx returns the unique id associated to the context if any.
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 ¶ added in v1.28.0
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 ¶ added in v1.32.0
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 URLHandler ¶
URLHandler adds the requested URL as a field to the context's logger using fieldKey as field key.
func UserAgentHandler ¶
UserAgentHandler adds the request's user-agent as a field to the context's logger using fieldKey as field key.
This section is empty.