uber-go / zap

Blazing fast, structured, leveled logging in Go.
https://pkg.go.dev/go.uber.org/zap
MIT License
22.1k stars 1.44k forks source link

Add option to wrap/override sink and encoder #1438

Open dkropachev opened 6 months ago

dkropachev commented 6 months ago

Is your feature request related to a problem? Please describe. I would want to override encoder, to mask some data out from logs, or encode it:

type MaskingEncoder struct {
    zapcore.Encoder
}

func (m *MaskingEncoder) EncodeEntry(entry zapcore.Entry, fields []zapcore.Field) (*buffer.Buffer, error) {
    filtered := make([]zapcore.Field, 0, len(fields))
    for _, field := range fields {
        key := strings.ToLower(field.Key)
        if slices.ContainsFunc(skipFieldRegexps, func(r *regexp.Regexp) bool {
            return r.Match([]byte(key))
        }) {
            continue
        }
        filtered = append(filtered, field)
    }
    return m.Encoder.EncodeEntry(entry, filtered)
}

And I want to wrap sinker to dump all the requests to a buffer to test logging.

Describe the solution you'd like I would like to do it same way it is done for zapcore.Core, via zap.WrapCore:

    l, err := zapConf.Build(zapcore.WrapEncoder())

Describe alternatives you've considered Alternatives to wrap encoder:

  1. Wrap whole logger and filter out fields
  2. Register another encoder and fix all the configs to use it.
  3. Copy zapcore.Config.Build code and inject it in there

Alternatives to wrap sinker:

  1. Copy zapcore.Config.Build code and inject it in there

Is this a breaking change? Nope