glog 日志库简介与测试【GO 常用的库】
〇、前言
golang/glog 是 C++ 版本 google/glog 的 Go 版本实现,基本实现了原生 glog 的日志格式。
在 Kuberntes 中,glog 是默认日志库。因此需要详细了解下。下面列举下 glog 的特点:
- 高效性:glog 采用了异步写入日志的方式,这意味着日志记录操作不会阻塞主程序的执行。它还使用了缓冲区来收集日志消息,并在后台线程中将它们写入磁盘。这种异步写入机制可以显著提高应用程序的性能。
- 灵活配置:glog 允许您通过命令行参数或配置文件来自定义日志输出的行为。可以指定要记录的日志级别、日志文件的路径、是否同时输出到标准错误流等。这使得 glog 非常适合于不同环境和需求的应用程序。
- 日志级别控制:glog 支持不同的日志级别,包括 INFO、WARNING、ERROR、FATAL 等。可以根据需要,选择要记录的日志级别,以便及时发现关键的日志信息。
- 日志格式化:glog 提供了丰富的日志格式化选项,允许您按照自己的喜好定义日志的输出格式。您可以指定时间戳、源代码位置、日志级别等信息的显示方式,以及自定义的文本和变量的输出。
- 日志回滚:glog 支持日志文件的自动回滚功能,可以根据文件大小或日期来切分日志文件。这样可以避免单个日志文件过大导致难以管理和分析。
- 跨平台支持:glog 是一个跨平台的日志库,可以在不同的操作系统上使用。它提供了对 Unix、Linux 和 Windows 等主流操作系统的支持。
强大功能且简单易用的 glog 日志库,为 GO 语言开发者提供了一种高效、灵活和可定制的日志记录解决方案。无论是小型项目还是大规模应用程序,glog 都能满足日常的日志需求,也能协助开发者更好地理解和调试代码。
glog 的基本实现逻辑就是,在 buffer 中写入格式化的内容并定期刷入文件中。
一、glog 详细介绍
1.1 日志级别与测试
glog 将日志级别分为 4 种,分别是:
- INFO:一般日志,可用于记录程序运行状态;
- WARNING:警告日志,记录潜在的问题或错误;
- ERROR:错误日志,记录程序运行中一些可恢复的错误,可能导致程序功能受限或出现异常情况,但是不会导致系统崩溃;
- FATAL:严重错误日志,程序遇到一个不可恢复的错误,在打印完日志后程序将会自动退出(
os.Exit())
开始测试之前,准备工作:
// 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:表示既在标准窗口输出也在文件中记录
记录日志的其他配置项简介:
- -stderrthreshold=ERROR 达到或高于此严重程度的日志事件被记录为标准错误以及文件。
- -log_backtrace_at="" 设置保存一般日志的文件和行号,例如:-log_backtrace_at = gopherflakes.go:234,默认堆栈跟踪都会写入 Info 日志,文件名的后缀可以不为 .go。
- -v=0 在指定级别上启用 v 级日志记录。
- -vmodule="" 通过数字指定文件的记录日志级别,可以同时配置多个文件的不同级别,用‘,’分隔。例如:-vmodule=recordio=2,file=1,gfs*=3,最后一个代表所有以‘gfs’开头的文件记录 3 级以下的日志。文件名的后缀必须为 .go,且可省略。
下面看下 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() 的调用结果。
参考:https://cloud.tencent.com/developer/article/1683448
glog 日志库简介与测试【GO 常用的库】的更多相关文章
- KingbaseES R6 集群备库网卡down测试案例
数据库版本: test=# select version(); version ------------------------------------------------------------ ...
- windows和linux环境下使用google的glog日志库
一.概述 glog是google推出的一款轻量级c++开源日志框架,源码在github上,目前最新release版本是v0.3.5. githut地址:https://github.com/googl ...
- 常用Python第三方库 简介
如果说强大的标准库奠定了python发展的基石,丰富的第三方库则是python不断发展的保证,随着python的发展一些稳定的第三库被加入到了标准库里面,这里有6000多个第三方库的介绍:点这里或者访 ...
- robotframework的学习笔记(十三)------Robot Framework常用库简介
标准库 Robot Framework可以直接导入使用的库,包括: Builtin:包含经常需要的关键字.自动导入无需import,因此总是可用的 Dialogs:提供了暂停测试执行和从用户的输入方式 ...
- Robot Framework常用库简介
标准库 Robot Framework可以直接导入使用的库,包括: • Builtin:包含经常需要的关键字.自动导入无需import,因此总是可用的 • Dialogs:提供了暂停测试执行和从用户的 ...
- RF常用库简介(robotframework)
标准库 Robot Framework可以直接导入使用的库,包括: Builtin:包含经常需要的关键字.自动导入无需import,因此总是可用的 Dialogs:提供了暂停测试执行和从用户的输入方式 ...
- 常用Python第三方库简介
如果说强大的标准库奠定了Python发展的基石,丰富的第三方库则是python不断发展的保证,随着python的发展一些稳定的第三库被加入到了标准库里面,这里有6000多个第三方库的介绍 下表中加粗并 ...
- Python3.x:第三方库简介
Python3.x:第三方库简介 环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex ...
- Python3 常用爬虫库的安装
Python3 常用爬虫库的安装 1 简介 Windows下安装Python3常用的爬虫库:requests.selenium.beautifulsoup4.pyquery.pymysql.pymon ...
- linux下P2P协议(BitTorrent)-libtorrent库编译,测试
1.libtorrent 简介,下载和编译 libtorrent简介 libtorrent是功能齐全的C ++ bittorrent的p2p协议实现,专注于效率和可伸缩性.它可以在嵌入式设备和台式机上 ...
随机推荐
- Java的Atomic原子类
Java SDK 并发包里提供了丰富的原子类,我们可以将其分为五个类别,这五个类别提供的方法基本上是相似的,并且每个类别都有若干原子类. 对基本数据类型的变量值进行原子更新: 对对象变量的指向进行原子 ...
- K8S in Action 读后感(概念简介)
一.K8S的用武之地 今天,大型单体应用正被逐渐拆分成小的.可独立运行的组件,我们称之为微服务.微服务彼此之间解耦,所以它们可以被独立开发.部署.升级.伸缩.这使得我们可以对每一个微服务实现快速迭代, ...
- 逍遥自在学C语言 | 宏定义技巧让你的C代码快人一步
前言 在C语言中,宏定义是一种预处理指令,用于在代码中定义和使用常量.函数或代码片段的替代. 宏定义使用#define关键字来定义,并在代码中进行替换.宏定义具有以下优点: 简化代码:宏定义可以将一些 ...
- 关于Pod中进程在节点中的研究
最近研究OpenShift virtulization, 各种Pod对KVM进程的封装,引发了Pod中进程到底在Node中是什么表现形势的好奇,因为对基础知识的不扎实,还是希望找个环境能仔细看看,建立 ...
- 重新温习git
在本地文件夹创建项目,使用git bash here,然后使用git clone[url]命令克隆,提示权限不足, 这是需要ssh重置了 1.删除原有.ssh文件下的known_hosts 2.设置用 ...
- c++中vector容器的用法
C语言中const关键字是constant的缩写,通常翻译为常量.常数等,它可以修饰变量.数组.指针.函数参数. vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器.ve ...
- 2023-07-03:讲一讲Redis缓存的数据一致性问题和处理方案。
2023-07-03:讲一讲Redis缓存的数据一致性问题和处理方案. 答案2023-07-03: 数据一致性 当使用缓存时,无论是在本地内存中缓存还是使用 Redis 等外部缓存系统,会引入数据同步 ...
- 用写代码的方式画图-试下PlantUML吧
1 序言 所谓一图胜千言,大家平日在工作中编写文档时,往往都需要画各种图来表达中心思想,比如流程图.时序图.UML 图,很多人选择使用 Axure .PrecessOn.Diagrams(darw.i ...
- Bellman-Ford算法及SPFA算法的思路及进一步优化
Bellman-Ford算法 算法 以边为研究对象的最短路算法. 应用场景 有负边权的最短路问题. 负环的判定. 算法原理 \(n\) 个点的最短路径最多经过 \(n - 1\) 条边. 每条边要么经 ...
- 快速上手 | Datavines 两表值比对规则用法
Datavines 是一站式开源数据可观测性平台,提供元数据管理.数据概览报告.数据质量管理,数据分布查询.数据趋势洞察等核心能力,致力于帮助用户全面地了解和掌管数据,让您做到心中有数. 场景 比较某 ...