一、关于glog库

glog
Lmmdd hh:mm:ss.uuuuuu threadid file:line] msgLInfoL

安装glog:

1
go get github.com/golang/glog

1.1 基本用法

flag
1
flag.Parse()
bufferglog.Flush()
1
defer glog.Flush()
-log_dir
1
2
3
4
5
6
7
8
9
10
11
12
13
package main
 
import (
    "flag"
    "github.com/golang/glog"
)
 
func main() {
    flag.Parse()
    defer glog.Flush()
 
    glog.Info("HelloWorld")
}

编译后执行:

1
./glog -log_dir=log

在log目录下会生成相应的日志文件,查看对应的日志:

Golang中glog库的使用方法

打印到标准输出

默认情况下,日志不是打印到标准输出中,如需打印到标准输出可以使用以下两个参数:

logtostderralsologtostderr

这两个参数都会把日志打印到标准错误中(在linux终端环境下,前台显示的标准错误和标准输出可以认为是同一个输出),调试日志时可以加上这两个参数中的任一:

Golang中glog库的使用方法

二、日志级别

v levelv module

2.1 打印特定级别的日志

使用方法:

1
glog.V(n).Info("Log message")
nn-v=x
1
2
3
4
5
6
7
func main() {
    flag.Parse()
    defer glog.Flush()
 
    glog.V(3).Info("Level 3 log")
    glog.V(5).Info("Level 5 log")
}

执行时设定日志级别为4,日志将不会打印出第二条级别为5的日志:

1
./glog -v=4 -log_dir=log

日志:

1
2
3
4
5
Log file created at: 2019/09/08 18:04:55
Running on machine: maqianos
Binary: Built with gc go1.10.4 for linux/amd64
Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
I0908 18:04:55.924127     546 main.go:12] Level 3 log

2.2 vmodule选项

vmodule选项可以在上面设定v level之后,单独再给某个文件设置日志级别,适用于以下场景:

  • 系统默认日志级别为3,但是希望main.go中的日志级别为5
./glog -v=4 -log_dir=log -vmodule=main=5
1
2
3
4
5
6
Log file created at: 2019/09/08 18:11:36
Running on machine: maqianos
Binary: Built with gc go1.10.4 for linux/amd64
Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
I0908 18:11:36.096301     557 main.go:12] Level 3 log
I0908 18:11:36.100119     557 main.go:13] Level 5 log

三、自定义修改

3.1 修改日志WARN为DEBUG

glog.go
1
2
3
4
5
6
7
8
const severityChar = "IWEF" // 改为"IDEF"
 
var severityName = []string{
    infoLog:  "INFO",
    warningLog: "WARN" // 改为"DEBUG",
    errorLog: "ERROR",
    fatalLog: "FATAL",
}

这里实现简单,改起来也简单。

3.2 默认打印到标准错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 搜索函数init
func init() {
    // 注释掉下面两行
    //flag.BoolVar(&logging.toStderr, "logtostderr", false, "log to standard error instead of files")
    //flag.BoolVar(&logging.alsoToStderr, "alsologtostderr", false, "log to standard error as well as files")
    
    // 添加下面两行
    logging.alsoToStderr = false
    logging.toStderr = true
 
    // Default stderrThreshold is ERROR.
    logging.stderrThreshold = errorLog
 
    logging.setVState(0, nil, false)
    go logging.flushDaemon()
}