mlog: refactor to use Components instead of Contexts for storing Logger
This commit is contained in:
parent
467bcbe52d
commit
8bd0664ba0
28
mlog/cmp.go
Normal file
28
mlog/cmp.go
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
package mlog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/mediocregopher/mediocre-go-lib/mcmp"
|
||||||
|
)
|
||||||
|
|
||||||
|
type cmpKey int
|
||||||
|
|
||||||
|
// SetLogger sets the given logger onto the Component. The logger can later be
|
||||||
|
// retrieved from the Component, or any of its children, using From.
|
||||||
|
func SetLogger(cmp *mcmp.Component, l *Logger) {
|
||||||
|
cmp.SetValue(cmpKey(0), l)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DefaultLogger is an instance of Logger which is returned by From when a
|
||||||
|
// Logger hasn't been previously set with SetLogger on the passed in Component.
|
||||||
|
var DefaultLogger = NewLogger()
|
||||||
|
|
||||||
|
// From returns the Logger which was set on the Component, or one of its
|
||||||
|
// ancestors, using SetLogger. If no Logger was ever set then DefaultLogger is
|
||||||
|
// returned.
|
||||||
|
func From(cmp *mcmp.Component) *Logger {
|
||||||
|
l, _ := cmp.Value(cmpKey(0)).(*Logger)
|
||||||
|
if l == nil {
|
||||||
|
l = DefaultLogger
|
||||||
|
}
|
||||||
|
return l
|
||||||
|
}
|
58
mlog/ctx.go
58
mlog/ctx.go
@ -1,58 +0,0 @@
|
|||||||
package mlog
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
)
|
|
||||||
|
|
||||||
type ctxKey int
|
|
||||||
|
|
||||||
// WithLogger returns the Context with the Logger carried by it.
|
|
||||||
func WithLogger(ctx context.Context, l *Logger) context.Context {
|
|
||||||
return context.WithValue(ctx, ctxKey(0), l)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DefaultLogger is an instance of Logger which is returned by From when a
|
|
||||||
// Logger hasn't been previously WithLogger on the Contexts passed in.
|
|
||||||
var DefaultLogger = NewLogger()
|
|
||||||
|
|
||||||
// From looks at each context and returns the Logger from the first Context
|
|
||||||
// which carries one via a WithLogger call. If none carry a Logger than
|
|
||||||
// DefaultLogger is returned.
|
|
||||||
func From(ctxs ...context.Context) *Logger {
|
|
||||||
for _, ctx := range ctxs {
|
|
||||||
if l, _ := ctx.Value(ctxKey(0)).(*Logger); l != nil {
|
|
||||||
return l
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return DefaultLogger
|
|
||||||
}
|
|
||||||
|
|
||||||
// Debug is a shortcut for
|
|
||||||
// mlog.From(ctxs...).Debug(desc, ctxs...)
|
|
||||||
func Debug(descr string, ctxs ...context.Context) {
|
|
||||||
From(ctxs...).Debug(descr, ctxs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Info is a shortcut for
|
|
||||||
// mlog.From(ctxs...).Info(desc, ctxs...)
|
|
||||||
func Info(descr string, ctxs ...context.Context) {
|
|
||||||
From(ctxs...).Info(descr, ctxs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warn is a shortcut for
|
|
||||||
// mlog.From(ctxs...).Warn(desc, ctxs...)
|
|
||||||
func Warn(descr string, ctxs ...context.Context) {
|
|
||||||
From(ctxs...).Warn(descr, ctxs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error is a shortcut for
|
|
||||||
// mlog.From(ctxs...).Error(desc, ctxs...)
|
|
||||||
func Error(descr string, ctxs ...context.Context) {
|
|
||||||
From(ctxs...).Error(descr, ctxs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fatal is a shortcut for
|
|
||||||
// mlog.From(ctxs...).Fatal(desc, ctxs...)
|
|
||||||
func Fatal(descr string, ctxs ...context.Context) {
|
|
||||||
From(ctxs...).Fatal(descr, ctxs...)
|
|
||||||
}
|
|
@ -107,8 +107,8 @@ type MessageJSON struct {
|
|||||||
Level string `json:"level"`
|
Level string `json:"level"`
|
||||||
Description string `json:"descr"`
|
Description string `json:"descr"`
|
||||||
|
|
||||||
// path -> key -> value
|
// key -> value
|
||||||
Annotations map[string]map[string]string `json:"annotations,omitempty"`
|
Annotations map[string]string `json:"annotations,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// DefaultHandler initializes and returns a Handler which will write all
|
// DefaultHandler initializes and returns a Handler which will write all
|
||||||
@ -131,7 +131,7 @@ func defaultHandler(out io.Writer) Handler {
|
|||||||
}
|
}
|
||||||
if len(msg.Contexts) > 0 {
|
if len(msg.Contexts) > 0 {
|
||||||
ctx := mctx.MergeAnnotations(msg.Contexts...)
|
ctx := mctx.MergeAnnotations(msg.Contexts...)
|
||||||
msgJSON.Annotations = mctx.Annotations(ctx).StringMapByPath()
|
msgJSON.Annotations = mctx.Annotations(ctx).StringMap()
|
||||||
}
|
}
|
||||||
|
|
||||||
return enc.Encode(msgJSON)
|
return enc.Encode(msgJSON)
|
||||||
|
@ -60,7 +60,7 @@ func TestLogger(t *T) {
|
|||||||
l.Error("buz", mctx.Annotate(ctx, "a", "b", "c", "d"))
|
l.Error("buz", mctx.Annotate(ctx, "a", "b", "c", "d"))
|
||||||
massert.Require(t,
|
massert.Require(t,
|
||||||
assertOut(`{"level":"WARN","descr":"baz"}`),
|
assertOut(`{"level":"WARN","descr":"baz"}`),
|
||||||
assertOut(`{"level":"ERROR","descr":"buz","annotations":{"/":{"a":"b","c":"d"}}}`),
|
assertOut(`{"level":"ERROR","descr":"buz","annotations":{"a":"b","c":"d"}}`),
|
||||||
)
|
)
|
||||||
|
|
||||||
l2 := l.Clone()
|
l2 := l.Clone()
|
||||||
|
Loading…
Reference in New Issue
Block a user