Go语言7-日志

日志是程序开发很重要的一部分,在java中,有一大堆第三方包,以至于各种冲突各种排除。本文看看go如何记录日志。

使用

go 自带log包,简单使用如下:

package main
import "log"
func main()  {
	// Println 写到标准日志记录器
	log.Println("first log msg")
}

2017/11/11 21:43:27 first log msg

log.Fatal("fatal log")
log.Panicln("panic message")

如果使用fatal,输出日志后会调用 os.Exit(1)。Panichln会写标准日志后调用panic()

如果默认使用log,输出msg前是:2017/11/11 21:43:27 日期和时间。也可以在init方法中配置输出:

package main
import "log"
func init() {
	log.SetPrefix("[DEBUG] ")
	log.SetFlags( log.Ldate|log.Lmicroseconds|log.Llongfile)
}
func main()  {
	log.Println("first log msg")
}

[DEBUG] 2017/11/11 21:50:40.706129 /Users/thoreau/Documents/go_workspace/src/hello/log.go:14: first log msg

init()会在main之前,作为程序初始化的一部分。log包中常量如下:

const (
	Ldate        = 1 << iota
	Ltime                       
	Lmicroseconds              
	Llongfile                
	Lshortfile                    
	LUTC                       
	LstdFlags     = Ldate | Ltime
)

iota 的 始 为 0,之后 iota 的 在每次处理为常量后,都会自 1。常量 LstdFlags 展示了如何使用这些标志。log包有一个很方便的地方就是,这些日志记录器是多 goroutine 安全的。

定制日志计量器

package main

import (
	"log"
	"os"
	"io/ioutil"
	"io"
)
var (
	Trace *log.Logger
	Info  *log.Logger
	Warn  *log.Logger
	Error *log.Logger
)

func init() {
	logfile, err := os.OpenFile("application_error.log",
		os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		log.Fatalln("Failed to open error log file:", err)
	}
	log.SetFlags(log.Ldate | log.Lmicroseconds | log.Llongfile)
	Trace = log.New(ioutil.Discard, "TRACE: ", log.Ldate|log.Ltime|log.Llongfile)
	Info = log.New(os.Stdout, "INFO: ", log.Ldate|log.Ltime|log.Llongfile)
	Warn = log.New(os.Stdout, "WARN: ", log.Ldate|log.Ltime|log.Llongfile)
	Error = log.New(io.MultiWriter(logfile, os.Stderr), "ERROR: ", log.Ldate|log.Ltime|log.Llongfile)
}
func main() {
	Trace.Println("trace msg")
	Info.Println("info msg")
	Warn.Println("warn msg")
	Error.Println("error msg")
}

使用log的new函数,初始化出一个Logger类型的值:

func New(out io.Writer, prefix string, flag int) *Logger {
return &Logger{out: out, prefix: prefix, flag: flag} }

有丢弃的,有标准输出的,有输入到文件的,根据Writer实现。

这样,我们就实现了类似java中log.info()的日志记录方式。


参考: [1]. 《Go语言实战》

CONTENTS