diff --git a/logger_test.go b/logger_test.go index a9f705788..e6b0d96e7 100644 --- a/logger_test.go +++ b/logger_test.go @@ -392,6 +392,21 @@ func TestLoggerReplaceCore(t *testing.T) { }) } +func TestLoggerIncreaseLevel(t *testing.T) { + withLogger(t, DebugLevel, opts(IncreaseLevel(WarnLevel)), func(logger *Logger, logs *observer.ObservedLogs) { + logger.Info("logger.Info") + logger.Warn("logger.Warn") + logger.Error("logger.Error") + require.Equal(t, 2, logs.Len(), "Expected no-op core to write no logs.") + assert.Equal( + t, + logs.AllUntimed()[0].Entry.Message, + "logger.Warn", + "Expected first logged message to be warn level message", + ) + }) +} + func TestLoggerHooks(t *testing.T) { hook, seen := makeCountingHook() withLogger(t, DebugLevel, opts(Hooks(hook)), func(logger *Logger, logs *observer.ObservedLogs) { diff --git a/options.go b/options.go index 7a6b0fca1..9ee608908 100644 --- a/options.go +++ b/options.go @@ -107,3 +107,10 @@ func AddStacktrace(lvl zapcore.LevelEnabler) Option { log.addStack = lvl }) } + +// IncreaseLevel increase the level of the logger. +func IncreaseLevel(lvl zapcore.LevelEnabler) Option { + return WrapCore(func(c zapcore.Core) zapcore.Core { + return zapcore.NewLevelCore(c, lvl) + }) +} diff --git a/zapcore/level_filter.go b/zapcore/level_filter.go new file mode 100644 index 000000000..869dd62e4 --- /dev/null +++ b/zapcore/level_filter.go @@ -0,0 +1,45 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zapcore + +type levelFilterCore struct { + Core + level LevelEnabler +} + +// NewLevelCore creates a core that can be used to increase the level of an existing +// Core. It cannot be used to decrease the logging level, as it acts as a filter +// before calling the underlying core. +func NewLevelCore(core Core, level LevelEnabler) Core { + return &levelFilterCore{core, level} +} + +func (c *levelFilterCore) Enabled(lvl Level) bool { + return c.level.Enabled(lvl) +} + +func (c *levelFilterCore) Check(ent Entry, ce *CheckedEntry) *CheckedEntry { + if !c.Enabled(ent.Level) { + return ce + } + + return c.Core.Check(ent, ce) +}