为了账号安全,请及时绑定邮箱和手机立即绑定

如何复制输入键并将其显示在与 Uber Zap 相同的日志中?

如何复制输入键并将其显示在与 Uber Zap 相同的日志中?

Go
慕码人2483693 2022-10-24 16:32:27
我想caller用另一个键名复制输入键method并在日志中显示...{"level":"error", "caller: "testing/testing.go:1193", "method": "testing/testing.go:1193", "message": "foo"}有任何想法吗?
查看完整描述

1 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

您不能更改 a 的字段zapcore.Entry。你可以改变它的编组方式,但老实说,将幽灵字段添加到结构中是一个糟糕的 hack。您可以做的是使用自定义编码器,并将[]zapcore.Field调用者的副本附加到新的字符串项。特别是,JSON 编码器的默认输出来自Caller.TrimmedPath():


type duplicateCallerEncoder struct {

    zapcore.Encoder

}


func (e *duplicateCallerEncoder) Clone() zapcore.Encoder {

    return &duplicateCallerEncoder{Encoder: e.Encoder.Clone()}

}


func (e *duplicateCallerEncoder) EncodeEntry(entry zapcore.Entry, fields []zapcore.Field) (*buffer.Buffer, error) {

    // appending to the fields list

    fields = append(fields, zap.String("method", entry.Caller.TrimmedPath()))

    return e.Encoder.EncodeEntry(entry, fields)

}

请注意,上述实现Encoder.Clone(). 有关详细信息,请参阅:为什么在 Uber Zap 中调用 logger.With 后自定义编码丢失?


然后您可以通过构建新的 Zap 核心或注册自定义编码器来使用它。注册的构造函数将 a 嵌入JSONEncoder到您的自定义编码器中,这是生产记录器的默认编码器:


func init() {

    // name is whatever you like

    err := zap.RegisterEncoder("duplicate-caller", func(config zapcore.EncoderConfig) (zapcore.Encoder, error) {

        return &duplicateCallerEncoder{Encoder: zapcore.NewJSONEncoder(config)}, nil

    })

    // it's reasonable to panic here, since the program can't initialize

    if err != nil {

        panic(err)

    }

}


func main() {

    cfg := zap.NewProductionConfig()

    cfg.Encoding = "duplicate-caller"

    logger, _ := cfg.Build()

    logger.Info("this is info")

}

以上使用您的自定义配置复制了生产记录器的初始化。


对于这样一个简单的配置,我更喜欢init()使用zap.RegisterEncoder. 如果需要,和/或如果您将其放在其他包中,它可以更快地重构代码。您当然可以在main(); 或者如果您需要额外的定制,那么您可以使用zap.New(zapcore.NewCore(myCustomEncoder, /* other args */))


你可以在这个操场上看到完整的程序:https ://go.dev/play/p/YLDXbdZ-qZP


它输出:


{"level":"info","ts":1257894000,"caller":"sandbox3965111040/prog.go:24","msg":"this is info","method":"sandbox3965111040/prog.go:24"}



查看完整回答
反对 回复 2022-10-24
  • 1 回答
  • 0 关注
  • 71 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信