diff --git a/zapcore/level.go b/zapcore/level.go index e575c9f43..56e88dc0c 100644 --- a/zapcore/level.go +++ b/zapcore/level.go @@ -55,6 +55,18 @@ const ( _maxLevel = FatalLevel ) +// ParseLevel parses a level based on the lower-case or all-caps ASCII +// representation of the log level. If the provided ASCII representation is +// invalid an error is returned. +// +// This is particularly useful when dealing with text input to configure log +// levels. +func ParseLevel(text string) (Level, error) { + var level Level + err := level.UnmarshalText([]byte(text)) + return level, err +} + // String returns a lower-case ASCII representation of the log level. func (l Level) String() string { switch l { diff --git a/zapcore/level_test.go b/zapcore/level_test.go index 28b75b37f..c4a120538 100644 --- a/zapcore/level_test.go +++ b/zapcore/level_test.go @@ -76,6 +76,28 @@ func TestLevelText(t *testing.T) { } } +func TestParseLevel(t *testing.T) { + tests := []struct { + text string + level Level + err string + }{ + {"info", InfoLevel, ""}, + {"DEBUG", DebugLevel, ""}, + {"FOO", 0, `unrecognized level: "FOO"`}, + } + for _, tt := range tests { + parsedLevel, err := ParseLevel(tt.text) + if len(tt.err) == 0 { + assert.NoError(t, err) + assert.Equal(t, tt.level, parsedLevel) + } else { + assert.Error(t, err) + assert.Contains(t, err.Error(), tt.err) + } + } +} + func TestCapitalLevelsParse(t *testing.T) { tests := []struct { text string