Skip to content

Commit

Permalink
Added methods to detect whether the log level is enabled.
Browse files Browse the repository at this point in the history
  • Loading branch information
edoger committed Apr 4, 2023
1 parent 3788f6d commit c6e4ea9
Show file tree
Hide file tree
Showing 2 changed files with 155 additions and 0 deletions.
66 changes: 66 additions & 0 deletions log.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,31 @@ type Log interface {
// WithStack adds call stack information to the current log.
WithStack() Log

// IsLevelEnabled checks whether the given log level is enabled.
// Always returns false if the given log level is invalid.
IsLevelEnabled(Level) bool

// IsPanicLevelEnabled checks whether the PanicLevel is enabled.
IsPanicLevelEnabled() bool

// IsFatalLevelEnabled checks whether the FatalLevel is enabled.
IsFatalLevelEnabled() bool

// IsErrorLevelEnabled checks whether the ErrorLevel is enabled.
IsErrorLevelEnabled() bool

// IsWarnLevelEnabled checks whether the WarnLevel is enabled.
IsWarnLevelEnabled() bool

// IsInfoLevelEnabled checks whether the InfoLevel is enabled.
IsInfoLevelEnabled() bool

// IsDebugLevelEnabled checks whether the DebugLevel is enabled.
IsDebugLevelEnabled() bool

// IsTraceLevelEnabled checks whether the TraceLevel is enabled.
IsTraceLevelEnabled() bool

// Log uses the given parameters to record a log of the specified level.
// If the given log level is PanicLevel, the given panic function will be
// called automatically after logging is completed.
Expand Down Expand Up @@ -425,6 +450,47 @@ func (o *log) getCaller(level Level) string {
return internal.GetCaller(o.caller.Skip())
}

// IsLevelEnabled checks whether the given log level is enabled.
// Always returns false if the given log level is invalid.
func (o *log) IsLevelEnabled(level Level) bool {
return Level(atomic.LoadUint32(&o.core.level)).IsEnabled(level)
}

// IsPanicLevelEnabled checks whether the PanicLevel is enabled.
func (o *log) IsPanicLevelEnabled() bool {
return o.IsLevelEnabled(PanicLevel)
}

// IsFatalLevelEnabled checks whether the FatalLevel is enabled.
func (o *log) IsFatalLevelEnabled() bool {
return o.IsLevelEnabled(FatalLevel)
}

// IsErrorLevelEnabled checks whether the ErrorLevel is enabled.
func (o *log) IsErrorLevelEnabled() bool {
return o.IsLevelEnabled(ErrorLevel)
}

// IsWarnLevelEnabled checks whether the WarnLevel is enabled.
func (o *log) IsWarnLevelEnabled() bool {
return o.IsLevelEnabled(WarnLevel)
}

// IsInfoLevelEnabled checks whether the InfoLevel is enabled.
func (o *log) IsInfoLevelEnabled() bool {
return o.IsLevelEnabled(InfoLevel)
}

// IsDebugLevelEnabled checks whether the DebugLevel is enabled.
func (o *log) IsDebugLevelEnabled() bool {
return o.IsLevelEnabled(DebugLevel)
}

// IsTraceLevelEnabled checks whether the TraceLevel is enabled.
func (o *log) IsTraceLevelEnabled() bool {
return o.IsLevelEnabled(TraceLevel)
}

// Log uses the given parameters to record a log of the specified level.
// If the given log level is PanicLevel, the given panic function will be
// called automatically after logging is completed.
Expand Down
89 changes: 89 additions & 0 deletions logger_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -724,3 +724,92 @@ func TestLogger_AsStandardLogger(t *testing.T) {
t.Fatalf("Logger.AsStandardLogger(): got %q, want %q", got, want)
}
}

func TestLogger_IsLevelEnabled(t *testing.T) {
o := New("test")
o.SetLevel(TraceLevel)

items := []struct {
Given Level
Want bool
}{
{TraceLevel, true},
{DebugLevel, true},
{InfoLevel, true},
{WarnLevel, true},
{ErrorLevel, true},
{FatalLevel, true},
{PanicLevel, true},
{Level(0), false},
{Level(10000), false},
}
for _, item := range items {
if got := o.IsLevelEnabled(item.Given); got != item.Want {
t.Fatalf("Logger.IsLevelEnabled(): got %v, want %v", got, item.Want)
}
}
if !o.IsPanicLevelEnabled() {
t.Fatal("Logger.IsPanicLevelEnabled(): got false, want true")
}
if !o.IsFatalLevelEnabled() {
t.Fatal("Logger.IsFatalLevelEnabled(): got false, want true")
}
if !o.IsErrorLevelEnabled() {
t.Fatal("Logger.IsErrorLevelEnabled(): got false, want true")
}
if !o.IsWarnLevelEnabled() {
t.Fatal("Logger.IsWarnLevelEnabled(): got false, want true")
}
if !o.IsInfoLevelEnabled() {
t.Fatal("Logger.IsInfoLevelEnabled(): got false, want true")
}
if !o.IsDebugLevelEnabled() {
t.Fatal("Logger.IsDebugLevelEnabled(): got false, want true")
}
if !o.IsTraceLevelEnabled() {
t.Fatal("Logger.IsTraceLevelEnabled(): got false, want true")
}

o.SetLevel(InfoLevel)

items = []struct {
Given Level
Want bool
}{
{TraceLevel, false},
{DebugLevel, false},
{InfoLevel, true},
{WarnLevel, true},
{ErrorLevel, true},
{FatalLevel, true},
{PanicLevel, true},
{Level(0), false},
{Level(10000), false},
}
for _, item := range items {
if got := o.IsLevelEnabled(item.Given); got != item.Want {
t.Fatalf("Logger.IsLevelEnabled(): got %v, want %v", got, item.Want)
}
}
if !o.IsPanicLevelEnabled() {
t.Fatal("Logger.IsPanicLevelEnabled(): got false, want true")
}
if !o.IsFatalLevelEnabled() {
t.Fatal("Logger.IsFatalLevelEnabled(): got false, want true")
}
if !o.IsErrorLevelEnabled() {
t.Fatal("Logger.IsErrorLevelEnabled(): got false, want true")
}
if !o.IsWarnLevelEnabled() {
t.Fatal("Logger.IsWarnLevelEnabled(): got false, want true")
}
if !o.IsInfoLevelEnabled() {
t.Fatal("Logger.IsInfoLevelEnabled(): got false, want true")
}
if o.IsDebugLevelEnabled() {
t.Fatal("Logger.IsDebugLevelEnabled(): got true, want false")
}
if o.IsTraceLevelEnabled() {
t.Fatal("Logger.IsTraceLevelEnabled(): got true, want false")
}
}

0 comments on commit c6e4ea9

Please sign in to comment.