【Go】go的日志框架-logrus初探
summary
logrus是针对go语言开发的一款日志系统,在本片文章中,将会对上手logrus的过程中遇到的一些问题做一个记录。这个记录参考了这篇文章。下面我们开始吧!
上手
package main import ( log "github.com/sirupsen/logrus" ) func main() { log.WithFields(log.Fields{ "animal": "walrus", }).Info("A walrus appears") }
这样就可以啦,可以看到输出的日志格式如下:
time="2018-08-11T15:42:22+08:00" level=info msg="A walrus appears" animal=walrus
那么接下来的问题是,以这种方式输出的日志可以看到就还是比较杂乱无章的,那么有没有方式把日志用一种比较有格式的方式输出呢?我们想到了JSON格式。那么下面我们用
log.SetFormatter(&log.JSONFormatter{})
这条语句,以JSON格式来输出我们的日志:
package main import ( "os" log "github.com/sirupsen/logrus" ) func init() { // 设置日志格式为json格式 log.SetFormatter(&log.JSONFormatter{}) // 设置将日志输出到标准输出(默认的输出为stderr,标准错误) // 日志消息输出可以是任意的io.writer类型 log.SetOutput(os.Stdout) // 设置日志级别为warn以上 log.SetLevel(log.WarnLevel) } func main() { log.WithFields(log.Fields{ "animal": "walrus", "size": 10, }).Info("A group of walrus emerges from the ocean") log.WithFields(log.Fields{ "omg": true, "number": 122, }).Warn("The group's number increased tremendously!") log.WithFields(log.Fields{ "omg": true, "number": 100, }).Fatal("The ice breaks!") }
输出对应如下:
{"level":"warning","msg":"The group's number increased tremendously!","number":122,"omg":true,"time":"2019-11-13T17:32:42+08:00"} {"level":"fatal","msg":"The ice breaks!","number":100,"omg":true,"time":"2019-11-13T17:32:42+08:00"}
除了setFormatter用于把日志的格式设置为JSON之外,我们在这里还设置了显示日志的级别。
并可以看到,每次在withField之后加上一种输出日志的格式之后就可以输出一行日志了。
深入
有时我们也需要在程序的不同部分中,向日志中不断加入信息,并在程序的最后进行输出,下面提供一种使用logger的办法:
logger:= log.WithFields(log.Fields{ "path": r.URL.Path, "method": r.Method, "request_id": reqID, "client_ip": r.RemoteAddr, "start_time": startTime, }) logger = logger.WithFields(log.Fields{ "error": err.Error(), }) logger.WithFields(log.Fields{ "error_code": aErr.Code, "error_msg": aErr.Msg, }).Warn("FAIL")
如图,用这种办法就可以在程序的各个部分中向同一段log中加入所需要的内容了。下面所需要做的就是吧logger作为一个参数在各个需要进行输出log的函数中传播了。