From ef359d339cc5966a9423a9ec9309fc64d44cf01e Mon Sep 17 00:00:00 2001 From: Amir Raminfar Date: Wed, 17 Jan 2024 14:01:40 -0800 Subject: [PATCH] feat: adds support for LogFmt. fixes #2695 (#2705) --- go.mod | 1 + go.sum | 2 ++ internal/docker/event_generator.go | 22 ++++++++++++++++++++++ internal/docker/level_guesser.go | 5 +++++ 4 files changed, 30 insertions(+) diff --git a/go.mod b/go.mod index bd79a2e2..89e11fc6 100644 --- a/go.mod +++ b/go.mod @@ -39,6 +39,7 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/distribution/reference v0.5.0 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/goccy/go-json v0.10.2 // indirect github.com/google/go-cmp v0.5.5 // indirect github.com/kr/pretty v0.2.1 // indirect diff --git a/go.sum b/go.sum index 0047ee9d..73758a52 100644 --- a/go.sum +++ b/go.sum @@ -37,6 +37,8 @@ github.com/go-chi/chi/v5 v5.0.11 h1:BnpYbFZ3T3S1WMpD79r7R5ThWX40TaFB7L31Y8xqSwA= github.com/go-chi/chi/v5 v5.0.11/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-chi/jwtauth/v5 v5.3.0 h1:X7RKGks1lrVeIe2omGyz47pNaNjG2YmwlRN5UKhN8qg= github.com/go-chi/jwtauth/v5 v5.3.0/go.mod h1:2PoGm/KbnzRN9ILY6HFZAI6fTnb1gEZAKogAyqkd6fY= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= diff --git a/internal/docker/event_generator.go b/internal/docker/event_generator.go index 8035e9a0..63e0865f 100644 --- a/internal/docker/event_generator.go +++ b/internal/docker/event_generator.go @@ -13,6 +13,7 @@ import ( "sync" "time" + "github.com/go-logfmt/logfmt" log "github.com/sirupsen/logrus" ) @@ -177,6 +178,27 @@ func createEvent(message string, streamType StdType) *LogEvent { } else { logEvent.Message = data } + } else if strings.Contains(message, "=") { + buffer := bufPool.Get().(*bytes.Buffer) + buffer.Reset() + defer bufPool.Put(buffer) + buffer.WriteString(message) + decoder := logfmt.NewDecoder(buffer) + data := make(map[string]string) + decoder.ScanRecord() + allValid := true + for decoder.ScanKeyval() { + key := decoder.Key() + value := decoder.Value() + if len(value) == 0 { + allValid = false + break + } + data[string(key)] = string(value) + } + if allValid && len(data) > 0 { + logEvent.Message = data + } } } } diff --git a/internal/docker/level_guesser.go b/internal/docker/level_guesser.go index 056b4ac0..7e4c91d1 100644 --- a/internal/docker/level_guesser.go +++ b/internal/docker/level_guesser.go @@ -45,6 +45,11 @@ func guessLogLevel(logEvent *LogEvent) string { if level, ok := value["level"].(string); ok { return level } + + case map[string]string: + if level, ok := value["level"]; ok { + return level + } } return ""