Skip to content

Commit 9cff809

Browse files
authored
fix: fixes log levels not being parsed correctly and supports short levels like dbg (#3491)
1 parent d93efed commit 9cff809

File tree

3 files changed

+43
-26
lines changed

3 files changed

+43
-26
lines changed

assets/components/LogViewer/LogLevel.vue

+1-4
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,11 @@ defineProps<{
4444
}
4545
4646
[data-level="error"],
47-
[data-level="severe"],
48-
[data-level="critical"],
4947
[data-level="fatal"] {
5048
@apply !bg-red;
5149
}
5250
53-
[data-level="warn"],
54-
[data-level="warning"] {
51+
[data-level="warn"] {
5552
@apply !bg-orange;
5653
}
5754
</style>

internal/docker/level_guesser.go

+37-21
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,37 @@ import (
1111
var SupportedLogLevels map[string]struct{}
1212

1313
// Changing this also needs to change the logContext.ts file
14-
var logLevels = []string{"error", "warn", "warning", "info", "debug", "trace", "severe", "critical", "fatal"}
15-
var plainLevels = map[string]*regexp.Regexp{}
16-
var bracketLevels = map[string]*regexp.Regexp{}
14+
var logLevels = [][]string{
15+
{"error", "err"},
16+
{"warn", "warning"},
17+
{"info", "inf"},
18+
{"debug", "dbg"},
19+
{"trace"},
20+
{"fatal", "sev", "severe", "crit", "critical"},
21+
}
22+
23+
var plainLevels = map[string][]*regexp.Regexp{}
24+
var bracketLevels = map[string][]*regexp.Regexp{}
25+
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+)`)
1726

1827
func init() {
19-
for _, level := range logLevels {
20-
plainLevels[level] = regexp.MustCompile("(?i)^" + level + "[^a-z]")
28+
for _, levelGroup := range logLevels {
29+
first := levelGroup[0]
30+
for _, level := range levelGroup {
31+
plainLevels[first] = append(plainLevels[first], regexp.MustCompile("(?i)^"+level+"[^a-z]"))
32+
}
2133
}
2234

23-
for _, level := range logLevels {
24-
bracketLevels[level] = regexp.MustCompile("(?i)\\[ ?" + level + " ?\\]")
35+
for _, levelGroup := range logLevels {
36+
first := levelGroup[0]
37+
for _, level := range levelGroup {
38+
bracketLevels[first] = append(bracketLevels[first], regexp.MustCompile("(?i)\\[ ?"+level+" ?\\]"))
39+
}
2540
}
2641

2742
SupportedLogLevels = make(map[string]struct{}, len(logLevels)+1)
28-
for _, level := range logLevels {
29-
SupportedLogLevels[level] = struct{}{}
43+
for _, levelGroup := range logLevels {
44+
SupportedLogLevels[levelGroup[0]] = struct{}{}
3045
}
3146
SupportedLogLevels["unknown"] = struct{}{}
3247
}
@@ -35,25 +50,26 @@ func guessLogLevel(logEvent *LogEvent) string {
3550
switch value := logEvent.Message.(type) {
3651
case string:
3752
value = stripANSI(value)
38-
for _, level := range logLevels {
53+
value = timestampRegex.ReplaceAllString(value, "")
54+
for _, levelGroup := range logLevels {
55+
first := levelGroup[0]
3956
// Look for the level at the beginning of the message
40-
if plainLevels[level].MatchString(value) {
41-
return level
57+
for _, regex := range plainLevels[first] {
58+
if regex.MatchString(value) {
59+
return first
60+
}
4261
}
4362

4463
// Look for the level in brackets
45-
if bracketLevels[level].MatchString(value) {
46-
return level
64+
for _, regex := range bracketLevels[first] {
65+
if regex.MatchString(value) {
66+
return first
67+
}
4768
}
4869

4970
// Look for the level in the middle of the message that are uppercase
50-
if strings.Contains(value, " "+strings.ToUpper(level)+" ") {
51-
return level
52-
}
53-
54-
// Look for levels with equal sign and quotes around them
55-
if strings.Contains(value, level+"=") {
56-
return level
71+
if strings.Contains(value, " "+strings.ToUpper(first)+" ") {
72+
return first
5773
}
5874
}
5975

internal/docker/level_guesser_test.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ func TestGuessLogLevel(t *testing.T) {
1313
input any
1414
expected string
1515
}{
16+
{"2024/12/30 12:21AM INF this is a test", "info"},
17+
{"2024-12-30T17:43:16Z DBG loggging debug from here", "debug"},
1618
{"ERROR: Something went wrong", "error"},
1719
{"WARN: Something might be wrong", "warn"},
1820
{"INFO: Something happened", "info"},
@@ -25,10 +27,12 @@ func TestGuessLogLevel(t *testing.T) {
2527
{"[ ERROR ] Something went wrong", "error"},
2628
{"[error] Something went wrong", "error"},
2729
{"[test] [error] Something went wrong", "error"},
28-
{"Some test with error=test", "error"},
2930
{"[foo] [ ERROR] Something went wrong", "error"},
3031
{"123 ERROR Something went wrong", "error"},
3132
{"123 Something went wrong", "unknown"},
33+
{"DBG Something went wrong", "debug"},
34+
{"inf Something went wrong", "info"},
35+
{"crit: Something went wrong", "fatal"},
3236
{orderedmap.New[string, string](
3337
orderedmap.WithInitialData(
3438
orderedmap.Pair[string, string]{Key: "key", Value: "value"},

0 commit comments

Comments
 (0)