klog

klog 是对 glog 的永久 fork,为了对 glog 做一些改进。

为什么又做了 klog?

glog 已经不再活跃开发了。它有一些缺点,而且我们又需要一些新功能。所以我们只能新创建一个 klog。

我们来说一下,glog 有哪些缺点,我们又需要什么新功能。

  1. glog 有很多 gotchas,给容器环境中使用 glog 带来挑战。

  2. glog 没有提供方便的测试方法,对使用它的软件的可靠性有影响。

  3. 我们还有一个长期目标:实现一个logging 的接口,可以允许我们添加 context,改变输出的格式等。

glog 缺陷

Kubernets 项目中有一个 issue 记录了glog 有哪些缺陷。Use of glog for logging is problematic,我们来看看。

  1. glog 在init 中注册了很多 flag,而且不能以编程方式配置其行为。对于 k8s 库的用户来说,他们必须调用 flag.Parse() 可能会感到惊讶,这很容易出错(例如,没有办法配置glog coredns/coredns#1597)。

  2. glog 的默认行为是将日志记录到磁盘上的文件中。一个库的用户通常不希望它在没有明确配置的情况下写入文件。

  3. 更糟糕的是,如果 glog 无法创建文件,它会调用os.Exit。这可能非常有害,特别是在使用只读根文件系统运行容器化二进制文件时,很容易触发。

  4. glog 不对其写入的文件进行任何管理,因此如果没有类似于 logrotate 的东西(特别是在容器中),日志文件将会不断积累。但是 logrotate 貌似也不容易处理 glog 的日志。

klog 的改进

  1. 使用 klog.InitFlags(nil) 显式地初始化全局flag,因为我们不再使用 init() 方法注册 flag

  2. 现在可以使用 log_file 而不是 log_dir 来记录到单个文件

  3. 如果您想将使用klog记录的所有内容重定向到其他地方(比如syslog!),您可以使用 klog.SetOutput() 方法并提供一个io.Writer。

  4. 更多的 log 规范 Logging Conventions