Skip to content

Commit

Permalink
WrapError: wrap an error with fields to be logged by zap.Error
Browse files Browse the repository at this point in the history
Related to uber-go/guide#179

Callsites that receive an error should either log, or return an error.

However, if the callsite has additioanl context, the simplest option is
to add it to the error, but it's then flattened into a string, losing
the benefit of structured logging. This often results in callsites
logging with additional fields, and returning an error that is likely
to be logged again.

`WrapError` provides a way for callsites to return an error that
includes fields to be logged, which will be added to an `errorFields`
key.
  • Loading branch information
prashantv committed Apr 12, 2023
1 parent 845ca51 commit eb82ae4
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 0 deletions.
34 changes: 34 additions & 0 deletions fields_error.go
@@ -0,0 +1,34 @@
package zap

import (
"go.uber.org/zap/zapcore"
)

type errorWithFields struct {
err error
fields []Field
}

// WrapError returns an error that will log the provided fields if the error
// is logged using `Error`.
func WrapError(err error, fields ...Field) error {
return &errorWithFields{
err: err,
fields: fields,
}

Check warning on line 18 in fields_error.go

View check run for this annotation

Codecov / codecov/patch

fields_error.go#L14-L18

Added lines #L14 - L18 were not covered by tests
}

func (e errorWithFields) Unwrap() error {
return e.err

Check warning on line 22 in fields_error.go

View check run for this annotation

Codecov / codecov/patch

fields_error.go#L21-L22

Added lines #L21 - L22 were not covered by tests
}

func (e errorWithFields) Error() string {
return e.err.Error()

Check warning on line 26 in fields_error.go

View check run for this annotation

Codecov / codecov/patch

fields_error.go#L25-L26

Added lines #L25 - L26 were not covered by tests
}

func (e errorWithFields) MarshalLogObject(oe zapcore.ObjectEncoder) error {
for _, f := range e.fields {
f.AddTo(oe)
}
return nil

Check warning on line 33 in fields_error.go

View check run for this annotation

Codecov / codecov/patch

fields_error.go#L29-L33

Added lines #L29 - L33 were not covered by tests
}
7 changes: 7 additions & 0 deletions zapcore/error.go
Expand Up @@ -75,6 +75,13 @@ func encodeError(key string, err error, enc ObjectEncoder) (retErr error) {
enc.AddString(key+"Verbose", verbose)
}
}

if errObj, ok := err.(ObjectMarshaler); ok {
if err := enc.AddObject(key+"Fields", errObj); err != nil {
return err
}

Check warning on line 82 in zapcore/error.go

View check run for this annotation

Codecov / codecov/patch

zapcore/error.go#L80-L82

Added lines #L80 - L82 were not covered by tests
}

return nil
}

Expand Down

0 comments on commit eb82ae4

Please sign in to comment.