Error logging

This commit is contained in:
binwiederhier 2023-02-06 16:01:32 -05:00
parent b5158adb51
commit 9b54f63eb1
5 changed files with 60 additions and 22 deletions

View file

@ -77,7 +77,11 @@ func (e *Event) Time(time time.Time) *Event {
// Err adds an "error" field to the log event
func (e *Event) Err(err error) *Event {
e.fields[errorField] = err.Error()
if c, ok := err.(Contexter); ok {
e.Fields(c.Context())
} else {
e.fields[errorField] = err.Error()
}
return e
}

View file

@ -4,7 +4,6 @@ import (
"bytes"
"github.com/stretchr/testify/require"
"heckel.io/ntfy/log"
"net/http"
"os"
"testing"
"time"
@ -23,6 +22,10 @@ func TestLog_TagContextFieldFields(t *testing.T) {
UserID: "u_abc",
IP: "1.2.3.4",
}
err := &fakeError{
Code: 123,
Message: "some error",
}
var out bytes.Buffer
log.SetOutput(&out)
log.SetFormat(log.JSONFormat)
@ -44,23 +47,39 @@ func TestLog_TagContextFieldFields(t *testing.T) {
"stripe_subscription_id": "sub_123",
}).
Tag("stripe").
Err(http.ErrHandlerTimeout).
Err(err).
Time(time.Unix(456, 0)).
Debug("Subscription status %s", "active")
expected := `{"time":123000,"level":"INFO","message":"hi there phil","field1":"value1","field2":123,"tag":"mytag"}
{"time":456000,"level":"DEBUG","message":"Subscription status active","error":"http: Handler timeout","stripe_customer_id":"acct_123","stripe_subscription_id":"sub_123","tag":"stripe","user_id":"u_abc","visitor_ip":"1.2.3.4"}
{"time":456000,"level":"DEBUG","message":"Subscription status active","error":"some error","error_code":123,"stripe_customer_id":"acct_123","stripe_subscription_id":"sub_123","tag":"stripe","user_id":"u_abc","visitor_ip":"1.2.3.4"}
`
require.Equal(t, expected, out.String())
}
type fakeError struct {
Code int
Message string
}
func (e fakeError) Error() string {
return e.Message
}
func (e fakeError) Context() log.Context {
return log.Context{
"error": e.Message,
"error_code": e.Code,
}
}
type fakeVisitor struct {
UserID string
IP string
}
func (v *fakeVisitor) Context() log.Context {
return map[string]any{
return log.Context{
"user_id": v.UserID,
"visitor_ip": v.IP,
}