From e871a41f77def6c68ccbb728f4b8cce2a13078ee Mon Sep 17 00:00:00 2001 From: Mads Jon Nielsen Date: Tue, 13 May 2025 13:38:01 +0200 Subject: [PATCH 1/6] Add GetSlogAttrFromError --- logger.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/logger.go b/logger.go index c8a64d3..ce9db5a 100644 --- a/logger.go +++ b/logger.go @@ -6,6 +6,7 @@ import ( "net" "net/http" "os" + "runtime/debug" "time" ) @@ -36,6 +37,17 @@ func NewLogger() Logger { return slog.New(slog.NewJSONHandler(os.Stdout, opts)) } +func GetSlogAttrFromError(err error) slog.Attr { + var attrs []slog.Attr + + attrs = append(attrs, slog.String("error.message", err.Error())) + attrs = append(attrs, slog.String("error.stack_trace", string(debug.Stack()))) + + attr := slog.Attr{} + attr.Value = slog.GroupValue(attrs...) + return attr +} + func GetSlogAttrFromRequest(req *http.Request) slog.Attr { userAgent := req.Header.Get("User-Agent") xForwardedFor := req.Header.Get("X-Forwarded-For") From d57ae9c9f8e599a9daac663025f621c5a1f895a4 Mon Sep 17 00:00:00 2001 From: Mads Jon Nielsen Date: Tue, 13 May 2025 14:20:28 +0200 Subject: [PATCH 2/6] Fix test --- logger_test.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/logger_test.go b/logger_test.go index 8af0592..2626368 100644 --- a/logger_test.go +++ b/logger_test.go @@ -1,11 +1,12 @@ package cego import ( - "fmt" - "github.com/stretchr/testify/mock" + "errors" "net/http" "net/http/httptest" "testing" + + "github.com/stretchr/testify/mock" ) func TestLogger(t *testing.T) { @@ -14,10 +15,17 @@ func TestLogger(t *testing.T) { logger := NewMockLogger() logger.Debug("Epic request data is attached", GetSlogAttrFromRequest(req)) - fmt.Println(GetSlogAttrFromRequest(req)) - // TODO: Figure out how mock.MatchedBy is working instead of using mock.Anything logger.AssertCalled(t, "Debug", "Epic request data is attached", mock.Anything) }) + t.Run("it can get err attr", func(t *testing.T) { + err := errors.New("test error") + logger := NewMockLogger() + logger.Error("Something has failed here", GetSlogAttrFromError(err)) + + // TODO: Figure out how mock.MatchedBy is working instead of using mock.Anything + logger.AssertCalled(t, "Error", "Something has failed here", mock.Anything) + }) + } From 06b16e04545e4d44019be8a983149dd482aef351 Mon Sep 17 00:00:00 2001 From: Mads Jon Nielsen Date: Wed, 14 May 2025 11:05:22 +0200 Subject: [PATCH 3/6] Remve slog.SetDefault. It's not working, yet! --- readme.md | 1 - 1 file changed, 1 deletion(-) diff --git a/readme.md b/readme.md index d70cfc6..4f0879e 100644 --- a/readme.md +++ b/readme.md @@ -38,7 +38,6 @@ handleFunc := func(writer http.ResponseWriter, request *http.Request) { // Setting your logger as the global one logger := log.NewLogger() -slog.SetDefault(logger) slog.Debug("Also in ecs format") ``` From 839ee6fdbfd18f6288e22565d245bd6e8b5819c2 Mon Sep 17 00:00:00 2001 From: Mads Jon Nielsen Date: Wed, 14 May 2025 13:11:27 +0200 Subject: [PATCH 4/6] Fix --- headers/consts.go | 1 + logger.go | 36 +++++++++++++++++++++++------------- logger_test.go | 5 +++-- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/headers/consts.go b/headers/consts.go index 3102ce4..7eb8460 100644 --- a/headers/consts.go +++ b/headers/consts.go @@ -5,6 +5,7 @@ const ( XForwardedMethod = "X-Forwarded-Method" XForwardedHost = "X-Forwarded-Host" XForwardedUri = "X-Forwarded-Uri" + XForwardedFor = "X-Forwarded-For" Accept = "Accept" UserAgent = "User-Agent" Cookie = "Cookie" diff --git a/logger.go b/logger.go index ce9db5a..f64361a 100644 --- a/logger.go +++ b/logger.go @@ -8,6 +8,8 @@ import ( "os" "runtime/debug" "time" + + "github.com/cego/go-lib/headers" ) type Logger interface { @@ -49,25 +51,33 @@ func GetSlogAttrFromError(err error) slog.Attr { } func GetSlogAttrFromRequest(req *http.Request) slog.Attr { - userAgent := req.Header.Get("User-Agent") - xForwardedFor := req.Header.Get("X-Forwarded-For") - remoteAddr := req.RemoteAddr + var attrs []slog.Attr + reqHeaders := req.Header + + remoteAddr := req.RemoteAddr clientIp, _, _ := net.SplitHostPort(remoteAddr) + attrs = append(attrs, slog.String("client.ip", clientIp)) - var attrs []slog.Attr + if reqHeaders.Get(headers.XForwardedFor) != "" { + attrs = append(attrs, slog.String("client.address", reqHeaders.Get(headers.XForwardedFor))) + } - attrs = append(attrs, slog.String("client.ip", clientIp)) - attrs = append(attrs, slog.String("user_agent.original", userAgent)) - if xForwardedFor != "" { - attrs = append(attrs, slog.String("client.address", xForwardedFor)) + if reqHeaders.Get(headers.UserAgent) != "" { + attrs = append(attrs, slog.String("user_agent.original", reqHeaders.Get(headers.UserAgent))) } - headers := req.Header.Clone() - headers.Set("Cookie", "") - headers.Set("Authorization", "") - headersJsonMarshalled, _ := json.Marshal(headers) - attrs = append(attrs, slog.String("http.request.headers.raw", string(headersJsonMarshalled))) + h := reqHeaders.Clone() + if h.Get(headers.Cookie) != "" { + h.Set(headers.Cookie, "") + } + if h.Get(headers.Authorization) != "" { + h.Set(headers.Authorization, "") + } + if len(h) > 0 { + headersJsonMarshalled, _ := json.Marshal(h) + attrs = append(attrs, slog.String("http.request.headers.raw", string(headersJsonMarshalled))) + } attr := slog.Attr{} attr.Value = slog.GroupValue(attrs...) diff --git a/logger_test.go b/logger_test.go index 2626368..00e1b63 100644 --- a/logger_test.go +++ b/logger_test.go @@ -15,16 +15,17 @@ func TestLogger(t *testing.T) { logger := NewMockLogger() logger.Debug("Epic request data is attached", GetSlogAttrFromRequest(req)) - // TODO: Figure out how mock.MatchedBy is working instead of using mock.Anything + // TODO: Figure out how to assert slog.Attr logger.AssertCalled(t, "Debug", "Epic request data is attached", mock.Anything) }) t.Run("it can get err attr", func(t *testing.T) { err := errors.New("test error") logger := NewMockLogger() + logger.Error("Something has failed here", GetSlogAttrFromError(err)) - // TODO: Figure out how mock.MatchedBy is working instead of using mock.Anything + // TODO: Figure out how to assert slog.Attr logger.AssertCalled(t, "Error", "Something has failed here", mock.Anything) }) From 35ca3ad17f9ff01e1fa420a7db9b06dc78ca2cab Mon Sep 17 00:00:00 2001 From: Mads Jon Nielsen Date: Wed, 4 Jun 2025 08:34:47 +0200 Subject: [PATCH 5/6] Update logger.go --- logger.go | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/logger.go b/logger.go index f64361a..c454857 100644 --- a/logger.go +++ b/logger.go @@ -59,15 +59,13 @@ func GetSlogAttrFromRequest(req *http.Request) slog.Attr { clientIp, _, _ := net.SplitHostPort(remoteAddr) attrs = append(attrs, slog.String("client.ip", clientIp)) - if reqHeaders.Get(headers.XForwardedFor) != "" { - attrs = append(attrs, slog.String("client.address", reqHeaders.Get(headers.XForwardedFor))) - } - - if reqHeaders.Get(headers.UserAgent) != "" { - attrs = append(attrs, slog.String("user_agent.original", reqHeaders.Get(headers.UserAgent))) - } - h := reqHeaders.Clone() + if h.Get(headers.XForwardedFor) != "" { + attrs = append(attrs, slog.String("client.address", h.Get(headers.XForwardedFor))) + } + if h.Get(headers.UserAgent) != "" { + attrs = append(attrs, slog.String("user_agent.original", h.Get(headers.UserAgent))) + } if h.Get(headers.Cookie) != "" { h.Set(headers.Cookie, "") } From 9377f3c59e568aadcf35dcaf61c7fc96ac95cd54 Mon Sep 17 00:00:00 2001 From: Mads Jon Nielsen Date: Wed, 4 Jun 2025 08:36:59 +0200 Subject: [PATCH 6/6] Update logger.go --- logger.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/logger.go b/logger.go index c454857..7143d08 100644 --- a/logger.go +++ b/logger.go @@ -59,13 +59,14 @@ func GetSlogAttrFromRequest(req *http.Request) slog.Attr { clientIp, _, _ := net.SplitHostPort(remoteAddr) attrs = append(attrs, slog.String("client.ip", clientIp)) - h := reqHeaders.Clone() - if h.Get(headers.XForwardedFor) != "" { - attrs = append(attrs, slog.String("client.address", h.Get(headers.XForwardedFor))) + if reqHeaders.Get(headers.XForwardedFor) != "" { + attrs = append(attrs, slog.String("client.address", reqHeaders.Get(headers.XForwardedFor))) + } + if reqHeaders.Get(headers.UserAgent) != "" { + attrs = append(attrs, slog.String("user_agent.original", reqHeaders.Get(headers.UserAgent))) } - if h.Get(headers.UserAgent) != "" { - attrs = append(attrs, slog.String("user_agent.original", h.Get(headers.UserAgent))) - } + + h := reqHeaders.Clone() if h.Get(headers.Cookie) != "" { h.Set(headers.Cookie, "") }