32.3 日志log包

Go语言标准包中有日志功能,对应在log包中。主要结构体是:

type Logger struct {
	mu     sync.Mutex // ensures atomic writes; protects the following fields
	prefix string     // prefix to write at beginning of each line
	flag   int        // properties
	out    io.Writer  // destination for output
	buf    []byte     // for accumulating text to write
}
func New(out io.Writer, prefix string, flag int) *Logger {
	return &Logger{out: out, prefix: prefix, flag: flag}
}

在log包中通过New函数得到一个Logger结构体指针,这个函数的三个参数分别是out,prefix,flag。pfefix可以指定日志信息的前缀,比如“[Debug]”等,一般根据实际需要定义,可根据情况随时通过SetPrefix()函数修改。flag是日志的前缀信息(在prefix之后),包括可配置的时间格式等,一般默认为LstdFlags就可以了。out是日志输出的目标,只要实现了io.Writer接口就可以作为out,log包中默认指定stderr为out,所以log包默认都是输出到标准设备。

var std = New(os.Stderr, "", LstdFlags)
func Println(v ...interface{}) {
	std.Output(2, fmt.Sprintln(v...))
}

也可以按照上面的思路,把日志信息写入到文件。

logfile, err := os.OpenFile("my.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)
if err != nil {
	log.Fatalln("fail to create log file!")
}
defer logfile.Close()
l:=log.New(logfile, "", log.LstdFlags)
l.Println("test")
num:=5
l.Println("test %d",num)

因为logfile已经实现了io.Writer,所以这里用做out,日志信息被写入到文件。log的方法Printf()可以把信息按照一定格式来写入。另外,在写入日志信息时都有加入并发锁,这是mu sync.Mutex的作用。

最后,log包的日志功能基本上能满足一般的开发需要,但相对还是比较简单,缺少日志分层控制,缺少对JSON格式的支持等,所以如果有需要灵活定制或大并发、大吞吐量的日志开发需求,建议考虑使用其他方法或途径来实现。