From 65163c451cdac3d2f457d0bc8692fcc57b787e9b Mon Sep 17 00:00:00 2001 From: Anmol Sethi Date: Thu, 3 Sep 2020 18:42:29 -0400 Subject: [PATCH 1/2] Remove nested Loggers in Make Closes #92 --- slog.go | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/slog.go b/slog.go index 3ad85d8..e106adc 100644 --- a/slog.go +++ b/slog.go @@ -67,14 +67,39 @@ type Logger struct { exit func(int) } -// Make creates a logger that writes logs to the passed sinks at LevelInfo. +func (l Logger) flatSinks() []Sink { + sinks := make([]Sink, 0, len(l.sinks)) + for _, s := range l.sinks { + if l2, ok := s.(Logger); ok { + sinks = append(sinks, l2.flatSinks()...) + continue + } + + sinks = append(sinks, s) + } + + return sinks +} + +// Make creates a logger that writes logs to the passed sinks. +// +// The name and level is taken from the first Logger passed. func Make(sinks ...Sink) Logger { - return Logger{ + l := Logger{ sinks: sinks, level: LevelInfo, exit: os.Exit, } + for _, s := range sinks { + if l2, ok := s.(Logger); ok { + l.level = l2.level + l.names = l2.names + break + } + } + l.sinks = l.flatSinks() + return l } // Debug logs the msg and fields at LevelDebug. @@ -137,12 +162,6 @@ func (l Logger) Named(name string) Logger { // equal to or above the given level. func (l Logger) Leveled(level Level) Logger { l.level = level - l.sinks = append([]Sink(nil), l.sinks...) - for i, s := range l.sinks { - if l2, ok := s.(Logger); ok { - l.sinks[i] = l2.Leveled(level) - } - } return l } From 95115a5031693a5efb1ce1a950eadbf7e7bf2892 Mon Sep 17 00:00:00 2001 From: Anmol Sethi Date: Thu, 3 Sep 2020 18:54:05 -0400 Subject: [PATCH 2/2] Handle *Logger correctly in Make --- slog.go | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/slog.go b/slog.go index e106adc..6509e28 100644 --- a/slog.go +++ b/slog.go @@ -70,7 +70,11 @@ type Logger struct { func (l Logger) flatSinks() []Sink { sinks := make([]Sink, 0, len(l.sinks)) for _, s := range l.sinks { - if l2, ok := s.(Logger); ok { + switch l2 := s.(type) { + case Logger: + sinks = append(sinks, l2.flatSinks()...) + continue + case *Logger: sinks = append(sinks, l2.flatSinks()...) continue } @@ -83,7 +87,7 @@ func (l Logger) flatSinks() []Sink { // Make creates a logger that writes logs to the passed sinks. // -// The name and level is taken from the first Logger passed. +// The name, level and fields are taken from the first Logger passed. func Make(sinks ...Sink) Logger { l := Logger{ sinks: sinks, @@ -91,14 +95,21 @@ func Make(sinks ...Sink) Logger { exit: os.Exit, } + l.sinks = l.flatSinks() for _, s := range sinks { - if l2, ok := s.(Logger); ok { + switch l2 := s.(type) { + case Logger: l.level = l2.level l.names = l2.names - break + l.fields = l2.fields + return l + case *Logger: + l.level = l2.level + l.names = l2.names + l.fields = l2.fields + return l } } - l.sinks = l.flatSinks() return l }