kratos icon indicating copy to clipboard operation
kratos copied to clipboard

[Feature][Suggestion] 移除kratos中打印debug和error信息的部分

Open iamharvey opened this issue 2 years ago • 2 comments

观察

最近,团队在一个新项目中使用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日志,我们的做法是:

  1. 先用 kratos 提供的default logger来把全局的log level设置成INFO级别;
  2. 再完成一些初始化处理的操作后,再把全局logger设置回我们自己的logger。



建议

  • 框架本身不应该打印debug或错误日志,应该尽可能遵循 "return error or do nothing“ 的原则,让用户去决定如何处理(而且打印本身也有安全隐患);
  • config 代码是一套很有价值的用于配置解析的代码,可以考虑重构出来,成为一个独立的项目,造福一方。

iamharvey avatar Aug 26 '22 02:08 iamharvey

RFC

shenqidebaozi avatar Aug 26 '22 02:08 shenqidebaozi

感谢建议,我认为默认设置提供的信息可以帮助的很多刚开始上手框架的朋友,应该予以保留。在该问题场景下是否可以通过设置filter来过滤指定level的日志: https://github.com/go-kratos/kratos/blob/617ee1aa39a09f1b93ce246d7a569e30605690fd/log/filter.go#L9-L13

另外也可以尝试在初始化时替换全局默认Logger为自己实现的Logger来避免意外的日志输出。

kagaya85 avatar Sep 02 '22 07:09 kagaya85

#2726

shenqidebaozi avatar Mar 16 '23 04:03 shenqidebaozi