日志是程序开发很重要的一部分,在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语言实战》