欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【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的函数中传播了。