Go语言自带的log模块已经很不错了,但实际使用时,会要求做得更细更规范些。
glog是Google开源日志库C++ glog的Go语言精简版,很小才两个文件。
它通过在命令行设置标志参数的方式来控制日志记录行为。
线程安全,atomic操作,性能很高。
支持分级(INFO/WARNING/ERROR/FATAL)。
可以设置按级别或条件来记录日志。
可以查看指定行的运行时堆栈信息。
所支持的参数:
flag.String(“log_dir”, “”, “If non-empty, write log files in this directory”)
日志输出目录
flag.BoolVar(&logging.toStderr, “logtostderr”, false, “log to standard error instead of files”)
logtostderr值为true的时候,日志信息输出到stderr。默认值为 false。
flag.BoolVar(&logging.alsoToStderr, “alsologtostderr”, false, “log to standard error as well as files”)
alsologtostderr值为true的时候,日志信息同时输出到stderr及文件。默认值为 false。
flag.Var(&logging.verbosity, “v”, “log level for V logs”)
输出小于等于此级别的日志信息,大于此级别的不会输出
flag.Var(&logging.stderrThreshold, “stderrthreshold”, “logs at or above this threshold go to stderr”)
严重性级别在指定级别以上的日志信息除了写入日志文件以外,还会输出到stderr。
flag.Var(&logging.vmodule, “vmodule”, “comma-separated list of pattern=N settings for file-filtered logging”会输出匹配表达式的.go文件中,级别小于等于N的日志 信息.不匹配表达式的文件则只会输出默认日志信息。但注意。
此选项可以被-v 参数覆盖
flag.Var(&logging.traceLocation, “log_backtrace_at”, “when logging hits line file:N, emit a stack trace”)
指定行的运行时堆栈信息
注意事项:
1. 因为是使用时依参数配置,所以需在main()中加上flag.Parse()
2. 需在结尾加上glog.Flush()
3. 依级别生成不同的日志文件,但级别高的日志信息会同时在级别低的日志文件中输出
产生的日志文件命令规则如下:
main.exe.XCL-PC.XCL-PC_XCL.log.WARNING.20150326-144521.10452
程序名称.电脑名称.当前用户名.log.日志级别.YYYYMMDD-HHMMSS.pid号
program,host,userName,tag,t.Year(),t.Month(),t.Day(),t.Hour(),t.Minute(),t.Second(),pid
附测试用文件:
//glog使用例子//glog: https://github.com/golang/glog//author: Xiong Chuan Liang//date: 2015-3-26package mainimport (“flag””glog””os””test”)func main() {flag.Parse()p, err := os.Getwd()if err != nil {glog.Info(“Getwd: “, err)} else {glog.Info(“Getwd: “, p)}glog.Info(“Prepare to repel boarders”)glog.Info(“222222222222—log_backtrace_at”)glog.Info(“333333333333”)glog.V(1).Infoln(“Processed1”, “nItems1”, “elements1”)glog.V(2).Infoln(“Processed2”, “nItems2”, “elements2”)glog.V(3).Infoln(“Processed3”, “nItems3”, “elements3”)glog.V(4).Infoln(“Processed4”, “nItems4”, “elements4”)glog.V(5).Infoln(“Processed5”, “nItems5”, “elements5”)glog.Error(“errrrr”)/*if glog.V(2) {glog.Info(“Starting transaction…”)}glog.V(2).Infoln(“Processed”, “nItems”, “elements”)ch := make(chan int)go func() {for i := 0; i < 100; i++ {glog.Info(“info:”, i)}ch <- 1}()<-chglog.Fatalf(“Initialization failed: %s”, errors.New(“test info”))*/test.TestVmodule()exit()}func exit() {glog.Flush()}
package testimport (“glog”)func TestVmodule() {glog.Info(“test() 222222222222—log_backtrace_at”)glog.Info(“test() 333333333333”)glog.V(1).Infoln(“test() Processed1”, “nItems1”, “test() elements1”)glog.V(2).Infoln(“test() Processed2”, “nItems2”, “test() elements2”)glog.V(3).Infoln(“test()Processed3”, “nItems3”, “test() elements3”)glog.V(4).Infoln(“test()Processed4”, “nItems4”, “test() elements4”)}附部份测试命令:
go run main.go -log_dir=./ -log_dir=./ -v 5
go run main.go -log_dir=./ -alsologtostderr=true -log_backtrace_at=main.go:26
// vmodule 会输出main.go文件,级别小于等于2的日志信息
go run main.go -log_dir=./ -alsologtostderr=true -vmodule=main*=2
//会输出test.go级别小于等于2的日志信息,其它文件则不会
go run main.go -log_dir=./ -alsologtostderr=true -vmodule=test*=2
go run main.go -log_dir=./ -alsologtostderr=true -vmodule=test*=2 -v=3
go run main.go -log_dir=./ -stderrthreshold=ERROR
这东西比C++版本用起来方便多了,功能也很不错,生产环境可以用用看。
MAIL : xcl_168@aliyun.com
BLOG: http://blog.csdn.net/xcl168