golang-klog
klog
klog 是对 glog 的永久 fork,为了对 glog 做一些改进。
为什么又做了 klog?
glog 已经不再活跃开发了。它有一些缺点,而且我们又需要一些新功能。所以我们只能新创建一个 klog。
我们来说一下,glog 有哪些缺点,我们又需要什么新功能。
-
glog 有很多 gotchas,给容器环境中使用 glog 带来挑战。
-
glog 没有提供方便的测试方法,对使用它的软件的可靠性有影响。
-
我们还有一个长期目标:实现一个logging 的接口,可以允许我们添加 context,改变输出的格式等。
glog 缺陷
Kubernets 项目中有一个 issue 记录了glog 有哪些缺陷。Use of glog for logging is problematic,我们来看看。
-
glog 在init 中注册了很多 flag,而且不能以编程方式配置其行为。对于 k8s 库的用户来说,他们必须调用 flag.Parse() 可能会感到惊讶,这很容易出错(例如,没有办法配置glog coredns/coredns#1597)。
-
glog 的默认行为是将日志记录到磁盘上的文件中。一个库的用户通常不希望它在没有明确配置的情况下写入文件。
-
更糟糕的是,如果 glog 无法创建文件,它会调用os.Exit。这可能非常有害,特别是在使用只读根文件系统运行容器化二进制文件时,很容易触发。
-
glog 不对其写入的文件进行任何管理,因此如果没有类似于 logrotate 的东西(特别是在容器中),日志文件将会不断积累。但是 logrotate 貌似也不容易处理 glog 的日志。
klog 的改进
-
使用
klog.InitFlags(nil)
显式地初始化全局flag,因为我们不再使用init()
方法注册 flag -
现在可以使用 log_file 而不是 log_dir 来记录到单个文件
-
如果您想将使用klog记录的所有内容重定向到其他地方(比如syslog!),您可以使用
klog.SetOutput()
方法并提供一个io.Writer。 -
更多的 log 规范 Logging Conventions