Golang glog使用详解
golang/glog 是 C++ 版本 google/glog 的 Go 版本实现,基本实现了原生 glog 的日志格式。在 Kuberntes 中,glog 是默认日志库。
glog 的使用与特性
通用功能
glog 将日志级别分为 4 种,分别是:
- INFO:普通日志;
- WARNING:告警日志;
- ERROR:错误日志;
- FATAL:严重错误日志,打印完日志后程序将会推出(
os.Exit()
)
glog 的使用很简单,可参考下面这个例子:
1
|
package main
|
当我们运行:
1
|
|
以上打印日志将会同时打印在 log/
目录和标准错误输出中(-alsologtostderr
)。
其中在 log/
中将会产生如下日志文件:
1
|
main.INFO -> main.ut1.test.log.INFO.20180715-130428.27339
|
其中 main.INFO
这类文件表示的是 INFO
日志对应的符号链接。当单个日志文件达到一定大小时,glog 将会有 rotate 的动作:即关闭已经满量的文件,新建日志文件。
vmodule 功能
glog 最常用的就是 V level 的功能,如下所示:
1
|
func main() {
|
当我们重新运行:
1
|
|
将不会看到任何输出,因为日志级别不够,我们通过指定日志级别(-v
,log level):
1
|
|
此时,日志级别小于或等于 4 的日志将被打印出来:
1
|
I0715 13:15:41.380611 29471 main.go:13] LEVEL 3 message
|
如果我们想对不同的文件实行不同的日志级别,可以用 vmodule 功能,如下代码:
1
|
func main() {
|
其中 bar()
的实现在 bar.go
:
1
|
func bar() {
|
当我们执行:
1
|
|
对所有文件的日志级别设定为 3 (-v=3
),但是对 bar.go
(-vmodule
的输入参数省去 .go
后缀,且必须以 -vmodule=recordio=2,file=1,gfs*=3
的语法格式)的日志级别设定为 5,此时会输出:
1
|
I0715 13:20:28.381611 30447 bar.go:6] LEVEL 4: level 4 message in bar.go
|
通过该功能,可以对指定模块采用不同日志级别的输出,可有效提升调试效率。
traceLocation 功能
traceLocation 的命令格式为 -log_backtrace_at=gopherflakes.go:234
,当运行到指定代码处时,将把该代码的栈信息打印出来,延续上面的代码,我们运行:
1
|
|
可见如下输出:
1
|
I0715 13:28:17.915837 31920 bar.go:6] LEVEL 4: level 4 message in bar.go
|
日志格式
从上面的例子可以看出,glog 打印的日志基本格式为:
1
|
<header>] <message>
|
header 和 message 之间用 ]
分隔。其中 header 的格式为:
1
|
Lmmdd hh:mm:ss.uuuuuu threadid file:line
|
这里要注意的是 L
,它代表了 glog 原本的日志级别:
1
|
I -> INFO
|
后面几个字段分别代表的是时间信息。在 C++ 中,threadid
表示的是线程信息,但在 Go 版本实现中,threadid
是进程 PID,即 os.Getpid()
的调用结果。
这部分详细代码可参考:glog.go
中的 formatHeader()
函数。
glog 的实现
其实,用 Go 实现一个日志库并不困难,其本质就是:在 buffer 中写入格式化的内容并定期刷入文件中。glog 的基本实现逻辑也是如此。
参考
本文来自博客园,作者:sunsky303,转载请注明原文链接:https://www.cnblogs.com/sunsky303/p/11081165.html