【Go】go的日志框架-logrus初探
程序员文章站
2022-05-21 14:47:35
summary logrus是针对go语言开发的一款日志系统,在本片文章中,将会对上手logrus的过程中遇到的一些问题做一个记录。这个记录参考了这篇文章。下面我们开始吧! 上手 package main import ( log "github.com/sirupsen/logrus" ) fun ......
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的函数中传播了。