From 10545b4c83dccc5da8fdbc638c6cb8d62c80cd6c Mon Sep 17 00:00:00 2001 From: hn8 <10730886+hn8@users.noreply.github.com> Date: Thu, 21 Oct 2021 06:55:38 +0800 Subject: [PATCH] Support logr.Marshaler and fmt.Stringer --- zerologr.go | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/zerologr.go b/zerologr.go index 5211570..5376fb6 100644 --- a/zerologr.go +++ b/zerologr.go @@ -22,6 +22,8 @@ package zerologr import ( + "fmt" + "github.com/go-logr/logr" "github.com/rs/zerolog" ) @@ -31,6 +33,12 @@ var ( NameFieldName = "logger" // NameSeparator separates names for logr.WithName NameSeparator = "/" + + // RenderArgsHook mutates the list of key-value pairs passed directly to Info and Error. + RenderArgsHook = DefaultRender + + // RenderValuesHook mutates the list of key-value pairs saved via WithValues. + RenderValuesHook = DefaultRender ) // Logger is type alias of logr.Logger @@ -102,13 +110,19 @@ func (ls *LogSink) msg(e *zerolog.Event, msg string, keysAndValues []interface{} if ls.name != "" { e.Str(NameFieldName, ls.name) } + if RenderArgsHook != nil { + keysAndValues = RenderArgsHook(keysAndValues) + } e = e.Fields(keysAndValues) - e.CallerSkipFrame(int(ls.depth)) + e.CallerSkipFrame(ls.depth) e.Msg(msg) } // WithValues returns a new LogSink with additional key/value pairs. func (ls LogSink) WithValues(keysAndValues ...interface{}) logr.LogSink { + if RenderValuesHook != nil { + keysAndValues = RenderValuesHook(keysAndValues) + } l := ls.l.With().Fields(keysAndValues).Logger() ls.l = &l return &ls @@ -135,3 +149,17 @@ func (ls LogSink) WithCallDepth(depth int) logr.LogSink { func (ls *LogSink) GetUnderlying() *zerolog.Logger { return ls.l } + +// DefaultRender supports logr.Marshaler and fmt.Stringer. +func DefaultRender(keysAndValues []interface{}) []interface{} { + for i, n := 1, len(keysAndValues); i < n; i += 2 { + value := keysAndValues[i] + switch v := value.(type) { + case logr.Marshaler: + keysAndValues[i] = v.MarshalLog() + case fmt.Stringer: + keysAndValues[i] = v.String() + } + } + return keysAndValues +}