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:// ...
随机推荐
- qsc54(区间dp)
题目链接:http://qscoj.cn/problem/54/ 题意:中文题诶- 思路:区间dp 我们可以用dp[i][j]存储区间[i, j]最少需要的打印次数,若没有相同的字母,那么需要的打印次 ...
- Nginx在Linux里安装 以及nginx实现负载均衡
Nginx 一.在Linux里安装软件 1. rpm命令 rpm: redhat package manager,红帽软件包管理套件 常用命令: 安装:rpm -ivh 软件包 i :安装模式 v : ...
- 黑马学习MyBatis 用MyBatis对表进行条件查询 模糊查询 动态sql
package cn.itcast.domain; /* CREATE TABLE `message` ( `id` int(11) NOT NULL, `command` varchar(16) D ...
- form常用表单标签
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 题解 UVA11354 【Bond】
并查集+按秩合并 传送门 大意:给出一张n个点m条边的无向图, 每条边有一个权值,有q个询问, 每次给出两个点s.t,找一条路, 使得路径上的边的最大权值最小. 我们可以发现,跑最小生成树会跑挂, 那 ...
- php:一个题目,关于优先级,及$a++和$a=$a+1,
这几天常看到微博上转发的一条微博:就做了下,竟做错了,所以就试着分析了下~~ 这是微博: 这是代码: <?php $c = 3; $b = 6; if ($c = 4 || $b = 4) { ...
- Prime Count 求大区间素数个数
http://acm.gdufe.edu.cn/Problem/read/id/1333 https://www.zhihu.com/question/29580448/answer/44874605
- SSIS父子维度
1.数据仓库结构: 2.区域的AttributeHierarchyVisible设置为False 3.Parent ID的Usage设置为Parent 4.级别命名: 5.结果:
- jQuery的一些备忘
操作元素的样式 主要包括以下几种方式: $("#msg").css("background"); //返回元素的背景颜色 $("#msg") ...
- nodejs 实践:express 最佳实践(六) express 自省获得所有的路由
nodejs 实践:express 最佳实践(六) express 自省获得所有的路由 某些情况下,你需要知道你的应用有多少路由,这在 express 中没有方法可以.因此我这边曲线了一下,做成了一个 ...