diff --git a/log/helper.go b/log/helper.go index cc0cb8c9307..19fd613bc89 100644 --- a/log/helper.go +++ b/log/helper.go @@ -66,6 +66,15 @@ func (h *Helper) WithContext(ctx context.Context) *Helper { } } +// Enabled returns true if the given level above this level. +// It delegates to the underlying *Filter. +func (h *Helper) Enabled(level Level) bool { + if l, ok := h.logger.(*Filter); ok { + return level >= l.level + } + return true +} + // Log Print log by level and keyvals. func (h *Helper) Log(level Level, keyvals ...interface{}) { _ = h.logger.Log(level, keyvals...) @@ -73,11 +82,17 @@ func (h *Helper) Log(level Level, keyvals ...interface{}) { // Debug logs a message at debug level. func (h *Helper) Debug(a ...interface{}) { + if !h.Enabled(LevelDebug) { + return + } _ = h.logger.Log(LevelDebug, h.msgKey, h.sprint(a...)) } // Debugf logs a message at debug level. func (h *Helper) Debugf(format string, a ...interface{}) { + if !h.Enabled(LevelDebug) { + return + } _ = h.logger.Log(LevelDebug, h.msgKey, h.sprintf(format, a...)) } @@ -88,11 +103,17 @@ func (h *Helper) Debugw(keyvals ...interface{}) { // Info logs a message at info level. func (h *Helper) Info(a ...interface{}) { + if !h.Enabled(LevelInfo) { + return + } _ = h.logger.Log(LevelInfo, h.msgKey, h.sprint(a...)) } // Infof logs a message at info level. func (h *Helper) Infof(format string, a ...interface{}) { + if !h.Enabled(LevelInfo) { + return + } _ = h.logger.Log(LevelInfo, h.msgKey, h.sprintf(format, a...)) } @@ -103,11 +124,17 @@ func (h *Helper) Infow(keyvals ...interface{}) { // Warn logs a message at warn level. func (h *Helper) Warn(a ...interface{}) { + if !h.Enabled(LevelWarn) { + return + } _ = h.logger.Log(LevelWarn, h.msgKey, h.sprint(a...)) } // Warnf logs a message at warnf level. func (h *Helper) Warnf(format string, a ...interface{}) { + if !h.Enabled(LevelWarn) { + return + } _ = h.logger.Log(LevelWarn, h.msgKey, h.sprintf(format, a...)) } @@ -118,11 +145,17 @@ func (h *Helper) Warnw(keyvals ...interface{}) { // Error logs a message at error level. func (h *Helper) Error(a ...interface{}) { + if !h.Enabled(LevelError) { + return + } _ = h.logger.Log(LevelError, h.msgKey, h.sprint(a...)) } // Errorf logs a message at error level. func (h *Helper) Errorf(format string, a ...interface{}) { + if !h.Enabled(LevelError) { + return + } _ = h.logger.Log(LevelError, h.msgKey, h.sprintf(format, a...)) } diff --git a/log/helper_test.go b/log/helper_test.go index c52f338b24c..750710c2d81 100644 --- a/log/helper_test.go +++ b/log/helper_test.go @@ -46,6 +46,13 @@ func BenchmarkHelperPrint(b *testing.B) { } } +func BenchmarkHelperPrintFilterLevel(b *testing.B) { + log := NewHelper(NewFilter(NewStdLogger(io.Discard), FilterLevel(LevelDebug))) + for i := 0; i < b.N; i++ { + log.Debug("test") + } +} + func BenchmarkHelperPrintf(b *testing.B) { log := NewHelper(NewStdLogger(io.Discard)) for i := 0; i < b.N; i++ { @@ -53,6 +60,13 @@ func BenchmarkHelperPrintf(b *testing.B) { } } +func BenchmarkHelperPrintfFilterLevel(b *testing.B) { + log := NewHelper(NewFilter(NewStdLogger(io.Discard), FilterLevel(LevelInfo))) + for i := 0; i < b.N; i++ { + log.Debugf("%s", "test") + } +} + func BenchmarkHelperPrintw(b *testing.B) { log := NewHelper(NewStdLogger(io.Discard)) for i := 0; i < b.N; i++ {