Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions headers/consts.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
49 changes: 35 additions & 14 deletions logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@ import (
"net"
"net/http"
"os"
"runtime/debug"
"time"

"github.com/cego/go-lib/headers"
)

type Logger interface {
Expand Down Expand Up @@ -36,26 +39,44 @@ func NewLogger() Logger {
return slog.New(slog.NewJSONHandler(os.Stdout, opts))
}

func GetSlogAttrFromRequest(req *http.Request) slog.Attr {
userAgent := req.Header.Get("User-Agent")
xForwardedFor := req.Header.Get("X-Forwarded-For")
remoteAddr := req.RemoteAddr
func GetSlogAttrFromError(err error) slog.Attr {
var attrs []slog.Attr

clientIp, _, _ := net.SplitHostPort(remoteAddr)
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 {
var attrs []slog.Attr

reqHeaders := req.Header

remoteAddr := req.RemoteAddr
clientIp, _, _ := net.SplitHostPort(remoteAddr)
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))
}

headers := req.Header.Clone()
headers.Set("Cookie", "<masked>")
headers.Set("Authorization", "<masked>")
headersJsonMarshalled, _ := json.Marshal(headers)
attrs = append(attrs, slog.String("http.request.headers.raw", string(headersJsonMarshalled)))
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.Cookie) != "" {
h.Set(headers.Cookie, "<masked>")
}
if h.Get(headers.Authorization) != "" {
h.Set(headers.Authorization, "<masked>")
}
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...)
Expand Down
19 changes: 14 additions & 5 deletions logger_test.go
Original file line number Diff line number Diff line change
@@ -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) {
Expand All @@ -14,10 +15,18 @@ 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
// 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 to assert slog.Attr
logger.AssertCalled(t, "Error", "Something has failed here", mock.Anything)
})

}
1 change: 0 additions & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -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")
```

Expand Down