Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Go日志库glog

详解Golang中日志库glog的使用

作者:橙子家

golang/glog 是 C++ 版本 google/glog 的 Go 版本实现,基本实现了原生 glog 的日志格式,下面大家就跟随小编一起了解一下glog的具体使用吧

〇、前言

golang/glog 是 C++ 版本 google/glog 的 Go 版本实现,基本实现了原生 glog 的日志格式。

在 Kuberntes 中,glog 是默认日志库。因此需要详细了解下。下面列举下 glog 的特点:

强大功能且简单易用的 glog 日志库,为 GO 语言开发者提供了一种高效、灵活和可定制的日志记录解决方案。无论是小型项目还是大规模应用程序,glog 都能满足日常的日志需求,也能协助开发者更好地理解和调试代码。

glog 的基本实现逻辑就是,在 buffer 中写入格式化的内容并定期刷入文件中。

一、glog 详细介绍

1.1 日志级别与测试

glog 将日志级别分为 4 种,分别是:

开始测试之前,准备工作:

// 1.创建文件夹和文件:./src/glog/main.go
// 2.初始化和整理当前模块(添加或删除)
go mod init
go mod tidy
// 3.拉取必要的库 glog
go get github.com/golang/glog

如下为 main.go 文件中的代码:

package main
import (
	"flag"
	"github.com/golang/glog"
)
func main() {
    // 用于解析命令行中 - 横线后边的参数和值,如下示例中的:-log_dir=log -alsologtostderr
    // go run main.go -log_dir=log -alsologtostderr
	flag.Parse()
    // defer() 退出前执行,清空缓存区,将日志写入文件
	defer glog.Flush()
	glog.Info("This is info message")
	glog.Infof("This is info message: %v", 12345)
	glog.InfoDepth(1, "This is info message", 12345)
	glog.Warning("This is warning message")
	glog.Warningf("This is warning message: %v", 12345)
	glog.WarningDepth(1, "This is warning message", 12345)
	glog.Error("This is error message")
	glog.Errorf("This is error message: %v", 12345)
	glog.ErrorDepth(1, "This is error message", 12345)
	glog.Fatal("This is fatal message")
	glog.Fatalf("This is fatal message: %v", 12345)
	glog.FatalDepth(1, "This is fatal message", 12345)
}

然后就是执行代码:

// 1.创建 log 文件夹,必须先创建,否则无法以文件形式输出日志
mkdir log
// 2.将日志写入到 log 文件夹下
go run main.go -log_dir=log -alsologtostderr
// log_dir:用来指定日志文件夹名
// alsologtostderr:表示既在标准窗口输出也在文件中记录

 记录日志的其他配置项简介:

下面看下 Warning 级别的日志文件记录的内容:

1.2 vmodule 配置

vmodule 参数通过 -v=int 来自由配置输出级别,int 代表级别的数字,默认为 0。如下示例:

package main
import (
	"flag"
	"github.com/golang/glog"
)
func main() {
	// 用于解析命令行中 - 横线后边的参数和值,如下示例中的:-log_dir=log -alsologtostderr
	// go run main.go -log_dir=log -alsologtostderr
	flag.Parse()
	// defer() 退出前执行,清空缓存区,将日志写入文件
	defer glog.Flush()
	glog.V(0).Info("LEVEL 0 message") // 使用日志级别 0
	glog.V(3).Info("LEVEL 3 message") // 使用日志级别 3
	glog.V(4).Info("LEVEL 4 message") // 使用日志级别 4
	glog.V(5).Info("LEVEL 5 message") // 使用日志级别 5
	glog.V(8).Info("LEVEL 8 message") // 使用日志级别 8
}

如下测试结果,当不加 -v 配置项时,只输出了默认级别为 0 的日志,当配置为 4 时,输出 <=4 级别的日志:

1.3 vmodule 多文件配置不同的日志级别

通过该功能,可以对指定模块采用不同日志级别的输出,可有效提升调试效率

main.go 文件内容:

package main
import (
	"flag"
	"github.com/golang/glog"
)
func main() {
	// 用于解析命令行中 - 横线后边的参数和值,如下示例中的:-log_dir=log -alsologtostderr
	// go run main.go -log_dir=log -alsologtostderr
	flag.Parse()
	// defer() 退出前执行,清空缓存区,将日志写入文件
	defer glog.Flush()
	bar()
	bar2()
	glog.V(0).Info("LEVEL 0 message") // 使用日志级别 3
	glog.V(3).Info("LEVEL 3 message") // 使用日志级别 3
	glog.V(4).Info("LEVEL 4 message") // 使用日志级别 4
	glog.V(5).Info("LEVEL 5 message") // 使用日志级别 5
	glog.V(8).Info("LEVEL 8 message") // 使用日志级别 8
}

bar.go、bar2.go 文件内容:

package main
import "github.com/golang/glog"
func bar() {
	glog.V(3).Info("LEVEL 3: level 3 message in bar.go")
	glog.V(4).Info("LEVEL 4: level 4 message in bar.go")
}
package main
import "github.com/golang/glog"
func bar2() {
	glog.V(4).Info("LEVEL 4: level 4 message in bar2.go")
}

如下运行语句,相关的三个文件都需要列出,全局配置为 -v=3,bar.go 文件中配置为 3 级,bar2.go 文件配置为 4 级,多文件间用‘,’分隔

go run main.go bar.go bar2.go -log_dir=log -alsologtostderr -v=3 -vmodule=bar=3,bar2=4

如下图为输出结果,bar.go 文件中大于 3 级的日志未输出,main.go 中 3 级及以下的日志输出:

对于文件名还可以使用通配符 *,如下测试:

go run main.go bar.go bar2.go -log_dir=log -alsologtostderr -v=3 -vmodule=bar*=4

1.4 traceLocation 功能(log_backtrace_at 参数配置)

 traceLocation 的命令格式为-log_backtrace_at=bar.go:6(文件全名:行号),当运行到指定代码处时,将把该代码的栈信息打印出来。

 如下语句运行代码,在文件 bar.go 中的第 6 行,输出栈信息:

go run main.go bar.go bar2.go -log_dir=log -alsologtostderr -v=3 -vmodule=bar=3,bar2=4 -log_backtrace_at=bar.go:6

1.5 日志格式简介

从前边几节中可知,日志默认的格式为:<header>] <message>,日志头信息和详细信息通过中括号 ] 来分隔。

header 的默认格式:Lmmdd hh:mm:ss.uuuuuu threadid file:line。其中开头的字母 L 代表的是日志级别 level,如下对应关系:

I -> INFO
W -> WARNING
E -> ERROR
F -> FATAL

threadid 是进程 PID,即 os.Getpid() 的调用结果。

到此这篇关于详解Golang中日志库glog的使用的文章就介绍到这了,更多相关Go日志库glog内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文