9cd6f6eef2
Current implementation stores a copy of the logger as a pointer and update its content, which is now unecessary since the introduction of WithContext. The new WithContext now takes the pointer and store it in the context if none is stored already or if the last one stored is a different pointer. This way it is still possible to update the context of a logger stored in the context, but it is also possible to store a copy of the logger in a sub-context. Fix #80
48 lines
1.1 KiB
Go
48 lines
1.1 KiB
Go
package zerolog
|
|
|
|
import (
|
|
"context"
|
|
)
|
|
|
|
var disabledLogger *Logger
|
|
|
|
func init() {
|
|
l := Nop()
|
|
disabledLogger = &l
|
|
}
|
|
|
|
type ctxKey struct{}
|
|
|
|
// WithContext returns a copy of ctx with l associated. If an instance of Logger
|
|
// is already in the context, the context is not updated.
|
|
//
|
|
// For instance, to add a field to an existing logger in the context, use this
|
|
// notation:
|
|
//
|
|
// ctx := r.Context()
|
|
// l := zerolog.Ctx(ctx)
|
|
// l.UpdateContext(func(c Context) Context {
|
|
// return c.Str("bar", "baz")
|
|
// })
|
|
func (l *Logger) WithContext(ctx context.Context) context.Context {
|
|
if lp, ok := ctx.Value(ctxKey{}).(*Logger); ok {
|
|
if lp == l {
|
|
// Do not store same logger.
|
|
return ctx
|
|
}
|
|
} else if l.level == Disabled {
|
|
// Do not store disabled logger.
|
|
return ctx
|
|
}
|
|
return context.WithValue(ctx, ctxKey{}, l)
|
|
}
|
|
|
|
// Ctx returns the Logger associated with the ctx. If no logger
|
|
// is associated, a disabled logger is returned.
|
|
func Ctx(ctx context.Context) *Logger {
|
|
if l, ok := ctx.Value(ctxKey{}).(*Logger); ok {
|
|
return l
|
|
}
|
|
return disabledLogger
|
|
}
|