kratos
kratos copied to clipboard
[Feature][Suggestion] 移除kratos中打印debug和error信息的部分
观察
最近,团队在一个新项目中使用kratos的config代码来解析配置时,发现有一条debug信息被打印了出来。查看源码发现,原来是在go-kratos的代码中,存在打印debug和error信息的情况,观测的源码如下:
func (c *config) Load() error {
for _, src := range c.opts.sources {
kvs, err := src.Load()
if err != nil {
return err
}
for _, v := range kvs {
log.Debugf("config loaded: %s format: %s", v.Key, v.Format)
}
if err = c.reader.Merge(kvs...); err != nil {
log.Errorf("failed to merge config source: %v", err)
return err
}
w, err := src.Watch()
if err != nil {
log.Errorf("failed to watch config source: %v", err)
return err
}
c.watchers = append(c.watchers, w)
go c.watch(w)
}
if err := c.reader.Resolve(); err != nil {
log.Errorf("failed to resolve config source: %v", err)
return err
}
return nil
}
在没有对kratos进行全局logger设置的情况下(比如我们的情况,使用的是自己的logger),debug信息就不可避免的被打印出来了。
为了干掉这条不期而遇的debug日志,我们的做法是:
- 先用 kratos 提供的default logger来把全局的log level设置成INFO级别;
- 再完成一些初始化处理的操作后,再把全局logger设置回我们自己的logger。
建议
- 框架本身不应该打印debug或错误日志,应该尽可能遵循 "return error or do nothing“ 的原则,让用户去决定如何处理(而且打印本身也有安全隐患);
- config 代码是一套很有价值的用于配置解析的代码,可以考虑重构出来,成为一个独立的项目,造福一方。
RFC
感谢建议,我认为默认设置提供的信息可以帮助的很多刚开始上手框架的朋友,应该予以保留。在该问题场景下是否可以通过设置filter来过滤指定level的日志: https://github.com/go-kratos/kratos/blob/617ee1aa39a09f1b93ce246d7a569e30605690fd/log/filter.go#L9-L13
另外也可以尝试在初始化时替换全局默认Logger为自己实现的Logger来避免意外的日志输出。
#2726