diff --git a/internal/container/level_guesser.go b/internal/container/level_guesser.go index 91079c3e..230a6fcc 100644 --- a/internal/container/level_guesser.go +++ b/internal/container/level_guesser.go @@ -20,23 +20,18 @@ var logLevels = [][]string{ {"fatal", "sev", "severe", "crit", "critical"}, } -var plainLevels = map[string][]*regexp.Regexp{} -var bracketLevels = map[string][]*regexp.Regexp{} +var plainLevels = map[string]*regexp.Regexp{} +var bracketLevels = map[string]*regexp.Regexp{} +var separatorLevels = 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 _, levelGroup := range logLevels { first := levelGroup[0] - for _, level := range levelGroup { - plainLevels[first] = append(plainLevels[first], regexp.MustCompile("(?i)^"+level+"[^a-z]")) - } - } - - for _, levelGroup := range logLevels { - first := levelGroup[0] - for _, level := range levelGroup { - bracketLevels[first] = append(bracketLevels[first], regexp.MustCompile("(?i)\\[ ?"+level+" ?\\]")) - } + levelsGroup := "(?:" + strings.Join(levelGroup, "|") + ")" + plainLevels[first] = regexp.MustCompile("(?i)^" + levelsGroup + "[^a-z]") + bracketLevels[first] = regexp.MustCompile("(?i)\\[ ?" + levelsGroup + " ?\\]") + separatorLevels[first] = regexp.MustCompile("(?i) " + levelsGroup + "[/-]") } SupportedLogLevels = make(map[string]struct{}, len(logLevels)+1) @@ -54,17 +49,18 @@ func guessLogLevel(logEvent *LogEvent) string { for _, levelGroup := range logLevels { first := levelGroup[0] // Look for the level at the beginning of the message - for _, regex := range plainLevels[first] { - if regex.MatchString(value) { - return first - } + if plainLevels[first].MatchString(value) { + return first } // Look for the level in brackets - for _, regex := range bracketLevels[first] { - if regex.MatchString(value) { - return first - } + if bracketLevels[first].MatchString(value) { + return first + } + + // Look for the level with a separator after + if separatorLevels[first].MatchString(value) { + return first } // Look for the level in the middle of the message that are uppercase and surrounded by quotes diff --git a/internal/container/level_guesser_test.go b/internal/container/level_guesser_test.go index 70ff08eb..ead2a1a9 100644 --- a/internal/container/level_guesser_test.go +++ b/internal/container/level_guesser_test.go @@ -14,6 +14,8 @@ func TestGuessLogLevel(t *testing.T) { expected string }{ {"2024/12/30 12:21AM INF this is a test", "info"}, + {"2025-01-07 22:00:08,059: DEBUG/MainProcess TaskPool: ", "debug"}, + {"Some test with error-test", "error"}, {"2024-12-30T17:43:16Z DBG loggging debug from here", "debug"}, {"2025-01-07 15:40:15,784 LL=\"ERROR\" some message", "error"}, {"2025-01-07 15:40:15,784 LL=\"WARN\" some message", "warn"}, @@ -35,6 +37,7 @@ func TestGuessLogLevel(t *testing.T) { {"123 ERROR Something went wrong", "error"}, {"123 Something went wrong", "unknown"}, {"DBG Something went wrong", "debug"}, + {"DBG with more error=msg", "debug"}, {"inf Something went wrong", "info"}, {"crit: Something went wrong", "fatal"}, {orderedmap.New[string, string](