Go日志库——log和logrus
1.Log库
在日常开发中,日志是必不可少的功能。虽然有时可以用
fmt
库输出一些信息,但是灵活性不够。Go 标准库提供了一个日志库
log
。
log
默认输出到标准错误(
stderr
),每条日志前会自动加上日期和时间。如果日志不是以换行符结尾的,那么
log
会自动加上换行符。即每条日志会在新行中输出。
log
提供了三组函数:
-
Print/Printf/Println
:正常输出日志;
-
Panic/Panicf/Panicln
:输出日志后,以拼装好的字符串为参数调用
panic
;
-
Fatal/Fatalf/Fatalln
:输出日志后,调用
os.Exit(1)
退出程序。
命名比较容易辨别,带
f
后缀的有格式化功能,带
ln
后缀的会在日志后增加一个换行符。
选项
// src/log/log.go
const (
Ldate = 1 << iota
Ltime
Lmicroseconds
Llongfile
Lshortfile
LUTC
)
设置选项可在每条输出的文本前增加一些额外信息,如日期时间、文件名等。
log
库提供了 6 个选项:
-
Ldate
:输出当地时区的日期,如
2020/02/07
;
-
Ltime
:输出当地时区的时间,如
11:45:45
;
-
Lmicroseconds
:输出的时间精确到微秒,设置了该选项就不用设置
Ltime
了。如
11:45:45.123123
;
-
Llongfile
:输出长文件名+行号,含包名,如
github.com/darjun/go-daily-lib/log/flag/main.go:50
;
-
Lshortfile
:输出短文件名+行号,不含包名,如
main.go:50
;
-
LUTC
:如果设置了
Ldate
或
Ltime
,将输出 UTC 时间,而非当地时区。
调用
log.SetFlag
设置选项,可以一次设置多个:
package main
import (
"log"
)
type User struct {
Name string
Age int
}
func main() {
u := User{
Name: "dj",
Age: 18,
}
log.SetFlags(log.Lshortfile | log.Ldate | log.Lmicroseconds)
log.Printf("%s login, age:%d", u.Name, u.Age)
}
log.New
接受三个参数:
-
io.Writer
:日志都会写到这个
Writer
中;
-
prefix
:前缀,也可以后面调用
logger.SetPrefix
设置;
-
flag
:选项,也可以后面调用
logger.SetFlag
设置。
上面代码将日志输出到一个
bytes.Buffer
,然后将这个
buf
打印到标准输出。
注意到,第一个参数为
io.Writer
,我们可以使用
io.MultiWriter
实现多目的地输出。下面我们将日志同时输出到标准输出、
bytes.Buffer
和文件中
package main
import (
"bytes"
"io"
"log"
"os"
)
type User struct {
Name string
Age int
}
func main() {
u := User{
Name: "dj",
Age: 18,
}
writer1 := &bytes.Buffer{}
writer2 := os.Stdout
writer3, err := os.OpenFile("log.txt", os.O_WRONLY|os.O_CREATE, 0755)
if err != nil {
log.Fatalf("create file log.txt failed: %v", err)
}
logger := log.New(io.MultiWriter(writer1, writer2, writer3), "", log.Lshortfile|log.LstdFlags)
logger.Printf("%s login, age:%d", u.Name, u.Age)
}
总结
go的官方log库提供了三种级别的日志,支持自定义,输出日期、时间、长短文件名+行号和信息。
2.Logrus库
logrus
完全兼容标准的
log
库,还支持文本、JSON 两种日志输出格式。
第三方库需要先安装:
$ go get github.com/sirupsen/logrus
后使用:
package main
import (
"github.com/sirupsen/logrus"
)
func main() {
logrus.SetLevel(logrus.TraceLevel)
logrus.Trace("trace msg")
logrus.Debug("debug msg")
logrus.Info("info msg")
logrus.Warn("warn msg")
logrus.Error("error msg")
logrus.Fatal("fatal msg")
logrus.Panic("panic msg")
}
*logrus*
的使用非常简单,与标准库
log
类似。
*logrus*
支持更多的日志级别:
-
Panic
:记录日志,然后
panic
。
-
Fatal
:致命错误,出现错误时程序无法正常运转。输出日志后,程序退出;
-
Error
:错误日志,需要查看原因;
-
Warn
:警告信息,提醒程序员注意;
-
Info
:关键操作,核心流程的日志;
-
Debug
:一般程序中输出的调试信息;
-
Trace
:很细粒度的信息,一般用不到;
日志级别从上向下依次增加,
Trace
最大,
Panic
最小。
*logrus*
有一个日志级别,高于这个级别的日志不会输出。
默认的级别为
InfoLevel
。所以为了能看到
Trace
和
Debug
日志,我们在
main
函数第一行设置日志级别为
TraceLevel
功能
支持输出日期、时间、文件名、添加字段、重定向输出、自定义日志格式、设置钩子hook。详情见参考文章2
3.参考文章
log文章
logrus文章