diff --git a/assets/components/LogViewer/LogLevel.vue b/assets/components/LogViewer/LogLevel.vue index 3eb92f11..5d347d60 100644 --- a/assets/components/LogViewer/LogLevel.vue +++ b/assets/components/LogViewer/LogLevel.vue @@ -44,14 +44,11 @@ defineProps<{ } [data-level="error"], -[data-level="severe"], -[data-level="critical"], [data-level="fatal"] { @apply !bg-red; } -[data-level="warn"], -[data-level="warning"] { +[data-level="warn"] { @apply !bg-orange; } diff --git a/internal/docker/level_guesser.go b/internal/docker/level_guesser.go index 9f03c92f..7fad92a7 100644 --- a/internal/docker/level_guesser.go +++ b/internal/docker/level_guesser.go @@ -11,22 +11,37 @@ import ( var SupportedLogLevels map[string]struct{} // Changing this also needs to change the logContext.ts file -var logLevels = []string{"error", "warn", "warning", "info", "debug", "trace", "severe", "critical", "fatal"} -var plainLevels = map[string]*regexp.Regexp{} -var bracketLevels = map[string]*regexp.Regexp{} +var logLevels = [][]string{ + {"error", "err"}, + {"warn", "warning"}, + {"info", "inf"}, + {"debug", "dbg"}, + {"trace"}, + {"fatal", "sev", "severe", "crit", "critical"}, +} + +var plainLevels = map[string][]*regexp.Regexp{} +var bracketLevels = map[string][]*regexp.Regexp{} +var timestampRegex = regexp.MustCompile(`^(?:\d{4}[-/]\d{2}[-/]\d{2}(?:[T ](?:\d{2}:\d{2}:\d{2}(?:\.\d+)?Z?|\d{2}:\d{2}(?:AM|PM)))?\s+)`) func init() { - for _, level := range logLevels { - plainLevels[level] = regexp.MustCompile("(?i)^" + level + "[^a-z]") + for _, levelGroup := range logLevels { + first := levelGroup[0] + for _, level := range levelGroup { + plainLevels[first] = append(plainLevels[first], regexp.MustCompile("(?i)^"+level+"[^a-z]")) + } } - for _, level := range logLevels { - bracketLevels[level] = regexp.MustCompile("(?i)\\[ ?" + level + " ?\\]") + for _, levelGroup := range logLevels { + first := levelGroup[0] + for _, level := range levelGroup { + bracketLevels[first] = append(bracketLevels[first], regexp.MustCompile("(?i)\\[ ?"+level+" ?\\]")) + } } SupportedLogLevels = make(map[string]struct{}, len(logLevels)+1) - for _, level := range logLevels { - SupportedLogLevels[level] = struct{}{} + for _, levelGroup := range logLevels { + SupportedLogLevels[levelGroup[0]] = struct{}{} } SupportedLogLevels["unknown"] = struct{}{} } @@ -35,25 +50,26 @@ func guessLogLevel(logEvent *LogEvent) string { switch value := logEvent.Message.(type) { case string: value = stripANSI(value) - for _, level := range logLevels { + value = timestampRegex.ReplaceAllString(value, "") + for _, levelGroup := range logLevels { + first := levelGroup[0] // Look for the level at the beginning of the message - if plainLevels[level].MatchString(value) { - return level + for _, regex := range plainLevels[first] { + if regex.MatchString(value) { + return first + } } // Look for the level in brackets - if bracketLevels[level].MatchString(value) { - return level + for _, regex := range bracketLevels[first] { + if regex.MatchString(value) { + return first + } } // Look for the level in the middle of the message that are uppercase - if strings.Contains(value, " "+strings.ToUpper(level)+" ") { - return level - } - - // Look for levels with equal sign and quotes around them - if strings.Contains(value, level+"=") { - return level + if strings.Contains(value, " "+strings.ToUpper(first)+" ") { + return first } } diff --git a/internal/docker/level_guesser_test.go b/internal/docker/level_guesser_test.go index e3c73689..2e62eb0d 100644 --- a/internal/docker/level_guesser_test.go +++ b/internal/docker/level_guesser_test.go @@ -13,6 +13,8 @@ func TestGuessLogLevel(t *testing.T) { input any expected string }{ + {"2024/12/30 12:21AM INF this is a test", "info"}, + {"2024-12-30T17:43:16Z DBG loggging debug from here", "debug"}, {"ERROR: Something went wrong", "error"}, {"WARN: Something might be wrong", "warn"}, {"INFO: Something happened", "info"}, @@ -25,10 +27,12 @@ func TestGuessLogLevel(t *testing.T) { {"[ ERROR ] Something went wrong", "error"}, {"[error] Something went wrong", "error"}, {"[test] [error] Something went wrong", "error"}, - {"Some test with error=test", "error"}, {"[foo] [ ERROR] Something went wrong", "error"}, {"123 ERROR Something went wrong", "error"}, {"123 Something went wrong", "unknown"}, + {"DBG Something went wrong", "debug"}, + {"inf Something went wrong", "info"}, + {"crit: Something went wrong", "fatal"}, {orderedmap.New[string, string]( orderedmap.WithInitialData( orderedmap.Pair[string, string]{Key: "key", Value: "value"},