go - 如何标准化 go-kit/kit/log 字段
问题描述
问题
go-kit/log 日志界面简单明了
type Logger interface {
Log(keyvals ...interface{}) error
}
但是人们倾向于以不同的方式思考,并以不同的名字命名相同的事物。
我在代码中看到有人将错误文本的字段称为“err”和其他“error”。这使得日志难以搜索。您必须同时搜索“err”和“error”。“msg”或“message”字段也可能是这种情况。
有没有办法标准化这样的命名?
解决方案
我会发现一个构建器模式更清晰,更具可读性:
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)
推荐阅读
- reinforced-typings - 配置增强类型以扩展与服务器继承模式无关的类
- mysql - 为什么 MySQL 查询执行计划在添加新列后发生了变化?
- list - 如何获取 cassandra 列表类型列项目的大小
- django - Django - Allauth 默认电子邮件是错误的
- sql - 在变量集中使用当前行计算 (SQL Server)
- css - transform: scaleX() 似乎改变了元素的高度
- python - 在熊猫中返回每个月的最后日期和值
- powershell - powershell在字符串后从文本文件导入数据
- vagrant - 为什么 VirtualBox 在执行 `vagrant up` 时会打开而不是保持无头状态?
- java - 如何使用 WebHDFS (Cloudera) 增加上传大小?