首页 > 解决方案 > 如何标准化 go-kit/kit/log 字段

问题描述

问题

go-kit/log 日志界面简单明了

type Logger interface {
    Log(keyvals ...interface{}) error
}

但是人们倾向于以不同的方式思考,并以不同的名字命名相同的事物。

我在代码中看到有人将错误文本的字段称为“err”和其他“error”。这使得日志难以搜索。您必须同时搜索“err”和“error”。“msg”或“message”字段也可能是这种情况。

有没有办法标准化这样的命名?

标签: gologgingnaming-conventions

解决方案


我会发现一个构建器模式更清晰,更具可读性:

type KVBuilder struct {
    KeyVals []interface{}
}

func NewKVBuilder() *KVBuilder {
    return &KVBuilder{}
}

func (k *KVBuilder) Err(err error) *KVBuilder {
    return k.KV("err", err)
}

func (k *KVBuilder) Msg(msg string) *KVBuilder {
    return k.KV("msg", msg)
}

func (k *KVBuilder) KV(kv ...interface{}) *KVBuilder {
    k.KeyVals = append(k.KeyVals, kv...)
    return k
}

使用它:

var logger Logger

logger.Log(NewKVBuilder().
    Err(errors.New("foo")).
    Msg("bar").
    KV("some", "other").
    KeyVals...,
)

如果您将另一种方法添加到KVBuilder

func (k *KVBuilder) LogTo(logger Logger) error {
    return logger.Log(k.KeyVals...)
}

你也可以像这样使用它:

NewKVBuilder().
    Err(errors.New("foo")).
    Msg("bar").
    KV("some", "other").
    LogTo(logger)

推荐阅读