1
| go get github.com/sirupsen/logrus
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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") }
|
Panic
:记录日志,然后panic
。
Fatal
:致命错误,出现错误时程序无法正常运转。输出日志后,程序退出;
Error
:错误日志,需要查看原因;
Warn
:警告信息,提醒程序员注意;
Info
:关键操作,核心流程的日志;
Debug
:一般程序中输出的调试信息;
Trace
:很细粒度的信息,一般用不到;
日志级别从上向下依次增加,Trace
最大,Panic
最小。
添加字段
有时候需要在输出中添加一些字段,可以通过调用logrus.WithField
和logrus.WithFields
实现。logrus.WithFields
接受一个logrus.Fields
类型的参数,其底层实际上为map[string]interface{}
:
1 2
| type Fields map[string]interface{}
|
下面程序在输出中添加两个字段name
和age
:
1 2 3 4 5 6 7 8 9 10 11 12
| package main
import ( "github.com/sirupsen/logrus" )
func main() { logrus.WithFields(logrus.Fields{ "name": "dj", "age": 18, }).Info("info msg") }
|
如果在一个函数中的所有日志都需要添加某些字段,可以使用WithFields
的返回值。例如在 Web 请求的处理器中,日志都要加上user_id
和ip
字段:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package main
import ( "github.com/sirupsen/logrus" )
func main() { requestLogger := logrus.WithFields(logrus.Fields{ "user_id": 10010, "ip": "192.168.32.15", })
requestLogger.Info("info msg") requestLogger.Error("error msg") }
|
实际上,WithFields
返回一个logrus.Entry
类型的值,它将logrus.Logger
和设置的logrus.Fields
保存下来。调用Entry
相关方法输出日志时,保存下来的logrus.Fields
也会随之输出。
重定向输出
默认情况下,日志输出到io.Stderr
。可以调用logrus.SetOutput
传入一个io.Writer
参数。后续调用相关方法日志将写到io.Writer
中。现在,我们就能像上篇文章介绍log时一样,可以搞点事情了。传入一个io.MultiWriter
,同时将日志写到bytes.Buffer
、标准输出和文件中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| package main
import ( "bytes" "io" "log" "os"
"github.com/sirupsen/logrus" )
func main() { 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) }
logrus.SetOutput(io.MultiWriter(writer1, writer2, writer3)) logrus.Info("info msg") }
|
日志格式
logrus
支持两种日志格式,文本和 JSON,默认为文本格式。可以通过logrus.SetFormatter
设置日志格式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package main
import ( "github.com/sirupsen/logrus" )
func main() { logrus.SetLevel(logrus.TraceLevel) logrus.SetFormatter(&logrus.JSONFormatter{})
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") }
|
程序输出 JSON 格式的日志:
1 2 3 4 5 6 7 8
| $ go run main.go {"level":"trace","msg":"trace msg","time":"2020-02-07T21:40:04+08:00"} {"level":"debug","msg":"debug msg","time":"2020-02-07T21:40:04+08:00"} {"level":"info","msg":"info msg","time":"2020-02-07T21:40:04+08:00"} {"level":"info","msg":"warn msg","time":"2020-02-07T21:40:04+08:00"} {"level":"error","msg":"error msg","time":"2020-02-07T21:40:04+08:00"} {"level":"fatal","msg":"fatal msg","time":"2020-02-07T21:40:04+08:00"} exit status 1
|