diff --git a/v2/slogger/appender.go b/v2/slogger/appender.go index 879bcc1..a7d59ef 100644 --- a/v2/slogger/appender.go +++ b/v2/slogger/appender.go @@ -173,13 +173,25 @@ func (self *FilterAppender) Flush() error { return self.Appender.Flush() } -func LevelFilter(threshold Level, appender Appender) *FilterAppender { +type LevelFilterAppender struct { + level Level + FilterAppender +} + +func (self *LevelFilterAppender) AllowsLevel(level Level) bool { + return level >= self.level +} + +func LevelFilter(threshold Level, appender Appender) Appender { filterFunc := func(log *Log) bool { return log.Level >= threshold } - return &FilterAppender{ - Appender: appender, - Filter: filterFunc, + return &LevelFilterAppender{ + threshold, + FilterAppender{ + Appender: appender, + Filter: filterFunc, + }, } } diff --git a/v2/slogger/logger.go b/v2/slogger/logger.go index 1951021..c8b014f 100644 --- a/v2/slogger/logger.go +++ b/v2/slogger/logger.go @@ -247,6 +247,10 @@ func (self *Logger) logf(level Level, errorCode ErrorCode, messageFmt string, co } } + if !self.AllowsLevel(level) { + return nil, errors + } + pc, file, line, ok := nonSloggerCaller() if ok == false { return nil, []error{fmt.Errorf("Failed to find the calling method.")} @@ -276,6 +280,26 @@ func (self *Logger) logf(level Level, errorCode ErrorCode, messageFmt string, co return log, errors } +type LevelTester interface { + AllowsLevel(Level) bool +} + +func (self *Logger) AllowsLevel(level Level) bool { + for _, appender := range self.Appenders { + if levelTester, ok := appender.(LevelTester); ok { + if levelTester.AllowsLevel(level) { + return true + } + } else { + // only takes one unknown filter to have to make the assumption that + // we allow this level + return true + } + } + // if we got to here then we know none of them allow the level + return false +} + type Level uint8 // The level is in an order such that the expressions