mirror of
https://github.com/amir20/dozzle.git
synced 2025-12-21 13:23:07 +01:00
feat: Supports log levels with common separators (#3656)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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](
|
||||
|
||||
Reference in New Issue
Block a user