很不错的日志包glog使用介绍

时间:2025-03-01 07:41:01
         Go语言自带的log模块已经很不错了,但实际使用时,会要求做得更细更规范些。
glog是Google开源日志库C++ glog的Go语言精简版,很小才两个文件。
它通过在命令行设置标志参数的方式来控制日志记录行为。
       线程安全,atomic操作,性能很高。
      支持分级(INFO/WARNING/ERROR/FATAL)。
      可以设置按级别或条件来记录日志。
      可以查看指定行的运行时堆栈信息。


所支持的参数:
     ("log_dir", "", "If non-empty, write log files in this directory")
           日志输出目录 

    (&, "logtostderr", false, "log to standard error instead of files")
         logtostderr值为true的时候,日志信息输出到stderr。默认值为 false。

   (&, "alsologtostderr", false, "log to standard error as well as files")
          alsologtostderr值为true的时候,日志信息同时输出到stderr及文件。默认值为 false。

   (&, "v", "log level for V logs")
          输出小于等于此级别的日志信息,大于此级别的不会输出 

    (&, "stderrthreshold", "logs at or above this threshold go to stderr")
          严重性级别在指定级别以上的日志信息除了写入日志文件以外,还会输出到stderr。

    (&, "vmodule", "comma-separated list of pattern=N settings for file-filtered logging"会输出匹配表达式的.go文件中,级别小于等于N的日志              信息.不匹配表达式的文件则只会输出默认日志信息。但注意。
          此选项可以被-v 参数覆盖

       (&, "log_backtrace_at", "when logging hits line file:N, emit a stack trace")
          指定行的运行时堆栈信息


注意事项:  
       1. 因为是使用时依参数配置,所以需在main()中加上()
       2. 需在结尾加上()
       3. 依级别生成不同的日志文件,但级别高的日志信息会同时在级别低的日志文件中输出

  

      产生的日志文件命令规则如下:

              -PC_XCL..20150326-144521.10452

             程序名称.电脑名称.当前用户名.log.日志级别.号    

program,
		host,
		userName,
		tag,
		(),
		(),
		(),
		(),
		(),
		(),
		pid


附测试用文件:  

//glog使用例子
//glog: /golang/glog
//author: Xiong Chuan Liang
//date: 2015-3-26

package main

import (
	"flag"
	"glog"
	"os"
	"test"
)

func main() {
	()

	p, err := ()
	if err != nil {
		("Getwd: ", err)
	} else {
		("Getwd: ", p)
	}

	("Prepare to repel boarders")
	("222222222222---log_backtrace_at")
	("333333333333")

	(1).Infoln("Processed1", "nItems1", "elements1")

	(2).Infoln("Processed2", "nItems2", "elements2")

	(3).Infoln("Processed3", "nItems3", "elements3")

	(4).Infoln("Processed4", "nItems4", "elements4")

	(5).Infoln("Processed5", "nItems5", "elements5")

	("errrrr")

	/*
		if (2) {
			("Starting transaction...")
		}
		(2).Infoln("Processed", "nItems", "elements")

		ch := make(chan int)
		go func() {
			for i := 0; i < 100; i++ {
				("info:", i)
			}
			ch <- 1
		}()
		<-ch
		("Initialization failed: %s", ("test info"))

	*/

	()
	exit()
}

func exit() {
	()
}

package test

import (
	"glog"
)

func TestVmodule() {
	("test() 222222222222---log_backtrace_at")
	("test() 333333333333")

	(1).Infoln("test() Processed1", "nItems1", "test() elements1")

	(2).Infoln("test() Processed2", "nItems2", "test() elements2")

	(3).Infoln("test()Processed3", "nItems3", "test() elements3")

	(4).Infoln("test()Processed4", "nItems4", "test() elements4")

}
附部份测试命令:
       go run -log_dir=./ -log_dir=./ -v 5
       go run -log_dir=./ -alsologtostderr=true -log_backtrace_at=:26

      // vmodule 会输出文件,级别小于等于2的日志信息
      go run -log_dir=./ -alsologtostderr=true -vmodule=main*=2

      //会输出级别小于等于2的日志信息,其它文件则不会
      go run -log_dir=./ -alsologtostderr=true -vmodule=test*=2

      go run -log_dir=./ -alsologtostderr=true -vmodule=test*=2 -v=3

      go run -log_dir=./ -stderrthreshold=ERROR


这东西比C++版本用起来方便多了,功能也很不错,生产环境可以用用看。


MAIL :  xcl_168@

BLOG: /xcl168