Golang glog使用详解
golang/glog 是 C++ 版本 google/glog 的 Go 版本实现,基本实现了原生 glog 的日志格式。在 Kuberntes 中,glog 是默认日志库。
glog 的使用与特性
通用功能
glog 将日志级别分为 4 种,分别是:
- INFO:普通日志;
- WARNING:告警日志;
- ERROR:错误日志;
- FATAL:严重错误日志,打印完日志后程序将会推出(
os.Exit())
glog 的使用很简单,可参考下面这个例子:
1 |
package main import ( |
当我们运行:
1 |
$ mkdir -p log && go run main.go -log_dir=log -alsologtostderr |
以上打印日志将会同时打印在 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 |
$ go run main.go -log_dir=log -alsologtostderr |
将不会看到任何输出,因为日志级别不够,我们通过指定日志级别(-v,log level):
1 |
$ go run main.go -v=4 -log_dir=log -alsologtostderr |
此时,日志级别小于或等于 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 |
$ go run main.go bar.go -v=3 -log_dir=log -alsologtostderr -vmodule=bar=5 |
对所有文件的日志级别设定为 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 |
$ go run main.go bar.go -v=3 -log_dir=log -alsologtostderr -vmodule=bar=5 -log_backtrace_at=bar.go:6 |
可见如下输出:
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 的基本实现逻辑也是如此。
参考
Golang glog使用详解的更多相关文章
- Golang Context 包详解
Golang Context 包详解 0. 引言 在 Go 语言编写的服务器程序中,服务器通常要为每个 HTTP 请求创建一个 goroutine 以并发地处理业务.同时,这个 goroutine 也 ...
- 【GoLang】golang context channel 详解
代码示例: package main import ( "fmt" "time" "golang.org/x/net/context" ) ...
- Golang bytes.buffer详解
原文:https://www.jianshu.com/p/e53083132a25 Buffer 介绍 Buffer 是 bytes 包中的一个 type Buffer struct{…} A buf ...
- Golang 并发Groutine详解
概述 1.并行和并发 并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行. 并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在 ...
- golang context用法详解
背景 在go服务器中,对于每个请求的request都是在单独的goroutine中进行的,处理一个request也可能设计多个goroutine之间的交互, 使用context可以使开发者方便的在这些 ...
- golang中接口详解
package main import ( "fmt" ) type Sayer interface { say() } type Mover interface { move() ...
- Golang入门教程(十三)延迟函数defer详解
前言 大家都知道go语言的defer功能很强大,对于资源管理非常方便,但是如果没用好,也会有陷阱哦.Go 语言中延迟函数 defer 充当着 try...catch 的重任,使用起来也非常简便,然而在 ...
- GoLang基础数据类型--->字典(map)详解
GoLang基础数据类型--->字典(map)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 可能大家刚刚接触Golang的小伙伴都会跟我一样,这个map是干嘛的,是 ...
- golang格式化输出-fmt包用法详解
golang格式化输出-fmt包用法详解 注意:我在这里给出golang查询关于包的使用的地址:https://godoc.org 声明: 此片文章并非原创,大多数内容都是来自:https:// ...
随机推荐
- PHP 数字补零 固定位数补0
在处理订单编号的时候,需要固定位数的数字,比如需要固定四位数格式: 1->0001 56->0056 288->0288 1992->1992 可以使用php内置函数str_p ...
- 洛谷P1655 小朋友的球(Stirling数)
P1655 小朋友的球 题目描述 @发源于 小朋友最近特别喜欢球.有一天他脑子抽了,从口袋里拿出了N个不同的球,想把它们放到M个相同的盒子里,并且要求每个盒子中至少要有一个球,他好奇有几种放法,于是尝 ...
- 洛谷P1976 鸡蛋饼(Catalan数)
P1976 鸡蛋饼 题目背景 Czyzoiers 都想知道小 x 为什么对鸡蛋饼情有独钟.经过一番逼问,小 x 道出 了实情:因为他喜欢圆. 题目描述 最近小 x 又发现了一个关于圆的有趣的问题:在圆 ...
- java基础第九篇之final和内部类等
final关键字:final:最终,终极 final:作用:修饰类,变量,方法.成员变量的访问 1.final修饰变量: final修饰局部变量: 把这个局部变量 变成一个厂里,这个厂里只能被赋值一次 ...
- VUE中模块与组件
组件:我们项目中,每一个资源(.js,.css,.vue,...)都是一个模块,这些模块是相互独立,但是我们可以通过类似于webpack构建工具把它们整合在一起,你可以理解为模块就是一个一个积木,通过 ...
- POJ-3352-RoadConstruction(边双联通分量,缩点)
链接:https://vjudge.net/problem/POJ-3352#author=0 题意: 给一个无向连通图,至少添加几条边使得去掉图中任意一条边不改变图的连通性(即使得它变为边双连通图) ...
- python大战机器学习——聚类和EM算法
注:本文中涉及到的公式一律省略(公式不好敲出来),若想了解公式的具体实现,请参考原著. 1.基本概念 (1)聚类的思想: 将数据集划分为若干个不想交的子集(称为一个簇cluster),每个簇潜在地对应 ...
- criteria用法
Criteria Query通过面向对象化的设计,将数据查询条件封装为一个对象.简单来讲,Criteria Query可以看作是传统SQL的对象化表示,如: Java代码 Criteria cri ...
- Middleware-请求管道的构成
Middleware-请求管道的构成 在 ASP.NET 中,我们知道,它有一个面向切面的请求管道,有19个主要的事件构成,能够让我们进行灵活的扩展.通常是在 web.config 中通过注册 Htt ...
- 微软官方NET Core 2.0
NET Core 2.0 微软官方发布的.NET Core 2.0相关的博客: Announcing .NET Standard 2.0 Announcing .NET Core 2.0 F# and ...