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:// ...
随机推荐
- 【NOIP模拟赛】密码锁
题目描述 hzwer有一把密码锁,由N个开关组成.一开始的时候,所有开关都是关上的.当且仅当开关x1,x2,x3,…xk为开,其他开关为关时,密码锁才会打开. 他可以进行M种的操作,每种操作有一个si ...
- 这几道Python面试题,稳准狠,Python面试题No15
必须放一个表情包,太魔性了! 第1题: 修改以下Python代码,使得下面的代码调用类A的show方法? 原始代码 class A(object): def run(self): print(&quo ...
- Java进程占用内存过高,排查解决方法
最近收到邮件报警,说内存使作率达到84%.如下图: 解决方法: A:可能是代码原因导致的问题: 1.使用命令:top 查看当前进程的状态 2.从上图可以看到PID:916的java进程占用内存较大.定 ...
- 如何在JMeter中使用ForEach控制器
Jmeter中的ForEach Controller遍历变量数组. 在这个JMeter教程中,我们将使用ForEach控制器循环访问JSON数组. 有时我们需要解析响应并提取某些信息.例如,在测试AP ...
- Python随笔---深浅拷贝
Python中为了避免某些方法的副作用(拷贝后有时更改原有数据),故存在有深浅拷贝的存在 浅拷贝导入copy方法集,使用copy_copy的方法进行 深拷贝一样导入copy方法集,使用copy_dee ...
- Uva12210-A Match Making Problem
对于每个数字二分找到大于等于它的数,再暴力找到第一个小于它的数 #include<bits/stdc++.h> #define inf 0x3f3f3f3f ; using namespa ...
- 位运算>>和>>>区别
int a=-1; Integer b=0; Integer c=0; System.out.println(Integer.toBinaryString(a)); b=a>>1; c=a ...
- kali linux 通过跑包的方式破解wifi密码
1. wlan0开启monitor mode : airmon-ng start wlan0 2. 查看附近的无线网络 : airodump-ng wlan0mon 3. 抓取无线 ...
- C - AtCoDeerくんと選挙速報 / AtCoDeer and Election Report
ceil有毒啊..用ceil一直错. 思路就是模拟吧,设当前的答案是ansx和ansy. 如果比例是小于ansx的,那么就要乘以一个倍数k1,使得a * k1 >= ansx的. 所以就用cei ...
- 网页抓取解析,使用JQuery选择器进行网页解析
最近开发一个小功能,数据库中一个基础表的数据从另一个网站采集. 因为网站的数据不定时更新,需要更新后自动采集最新的内容. 怎么判断更新数据没有? 好在网站有一个更新日志提示的地方,只需要对比本地保留的 ...