diff --git a/console.go b/console.go index 10c1a1c9..7801e548 100644 --- a/console.go +++ b/console.go @@ -401,24 +401,29 @@ func consoleDefaultFormatTimestamp(timeFormat string, location *time.Location, n } func consoleDefaultFormatLevel(noColor bool) Formatter { + const unknownLevel = "???" + stripLevel := func(ll string) string { + if len(ll) == 0 { + return unknownLevel + } + if len(ll) > 3 { + ll = ll[:3] + } + return strings.ToUpper(ll) + } return func(i interface{}) string { - var l string if ll, ok := i.(string); ok { level, _ := ParseLevel(ll) fl, ok := FormattedLevels[level] if ok { - l = colorize(fl, LevelColors[level], noColor) - } else { - l = strings.ToUpper(ll)[0:3] - } - } else { - if i == nil { - l = "???" - } else { - l = strings.ToUpper(fmt.Sprintf("%s", i))[0:3] + return colorize(fl, LevelColors[level], noColor) } + return stripLevel(ll) + } + if i == nil { + return unknownLevel } - return l + return stripLevel(fmt.Sprintf("%s", i)) } } diff --git a/console_test.go b/console_test.go index 08121d06..7992f8e9 100644 --- a/console_test.go +++ b/console_test.go @@ -320,6 +320,85 @@ func TestConsoleWriter(t *testing.T) { t.Errorf("Unexpected output %q, want: %q", actualOutput, expectedOutput) } }) + + t.Run("With an extra 'level' field", func(t *testing.T) { + t.Run("malformed string", func(t *testing.T) { + cases := []struct { + field string + output string + }{ + {"", " ??? Hello World foo=bar\n"}, + {"-", " - Hello World foo=bar\n"}, + {"1", " " + zerolog.FormattedLevels[1] + " Hello World foo=bar\n"}, + {"a", " A Hello World foo=bar\n"}, + {"12", " 12 Hello World foo=bar\n"}, + {"a2", " A2 Hello World foo=bar\n"}, + {"2a", " 2A Hello World foo=bar\n"}, + {"ab", " AB Hello World foo=bar\n"}, + {"12a", " 12A Hello World foo=bar\n"}, + {"a12", " A12 Hello World foo=bar\n"}, + {"abc", " ABC Hello World foo=bar\n"}, + {"123", " 123 Hello World foo=bar\n"}, + {"abcd", " ABC Hello World foo=bar\n"}, + {"1234", " 123 Hello World foo=bar\n"}, + {"123d", " 123 Hello World foo=bar\n"}, + {"01", " " + zerolog.FormattedLevels[1] + " Hello World foo=bar\n"}, + {"001", " " + zerolog.FormattedLevels[1] + " Hello World foo=bar\n"}, + {"0001", " " + zerolog.FormattedLevels[1] + " Hello World foo=bar\n"}, + } + for i, c := range cases { + c := c + t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) { + buf := &bytes.Buffer{} + out := zerolog.NewConsoleWriter() + out.NoColor = true + out.Out = buf + log := zerolog.New(out) + + log.Debug().Str("level", c.field).Str("foo", "bar").Msg("Hello World") + + actualOutput := buf.String() + if actualOutput != c.output { + t.Errorf("Unexpected output %q, want: %q", actualOutput, c.output) + } + }) + } + }) + + t.Run("wierd value", func(t *testing.T) { + cases := []struct { + field interface{} + output string + }{ + {0, " 0 Hello World foo=bar\n"}, + {1, " 1 Hello World foo=bar\n"}, + {-1, " -1 Hello World foo=bar\n"}, + {-3, " -3 Hello World foo=bar\n"}, + {-32, " -32 Hello World foo=bar\n"}, + {-321, " -32 Hello World foo=bar\n"}, + {12, " 12 Hello World foo=bar\n"}, + {123, " 123 Hello World foo=bar\n"}, + {1234, " 123 Hello World foo=bar\n"}, + } + for i, c := range cases { + c := c + t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) { + buf := &bytes.Buffer{} + out := zerolog.NewConsoleWriter() + out.NoColor = true + out.Out = buf + log := zerolog.New(out) + + log.Debug().Interface("level", c.field).Str("foo", "bar").Msg("Hello World") + + actualOutput := buf.String() + if actualOutput != c.output { + t.Errorf("Unexpected output %q, want: %q", actualOutput, c.output) + } + }) + } + }) + }) } func TestConsoleWriterConfiguration(t *testing.T) {