Golang日志框架-logrus初探

667 阅读3分钟

前言

golang自带的log可以满足小部分场景,而如果我们需要有个比较完善的日志模块,那就可以用一些比较成熟的框架,这里推荐logrus,logrus是针对go语言开发的一款日志框架,在github上star数也比较高,其有丰富的hook,且可以自定义,并且完全兼容golang标准库日志模块。

logrus特性

  • logrus拥有六种日志级别,debug、info、warn、error、fatal和panic。
  • 可扩展的hook机制,使用者可以通过hook的方式将日志分发到任意地方,如标准输出、本地文件系统、logstash、es等。
  • 可选的日志输出格式,内置了JSONFormatter和TextFormatter两种日志格式,还可以手动实现接口Formatter来定义自己的日志格式。
  • Field机制,鼓励通过Field机制进行精细化、结构话的日志记录。

logrus使用

简单示例

package main

import (
	log "github.com/sirupsen/logrus"
)
func main()  {
	log.WithFields(log.Fields{
		"request": "test",
	}).Info("logger-test")
}

这样就可以了,可以看到日志输出如下:

那么接下来的问题是,以这种方式输出的日志可以看到的是比较杂乱无章的,那么怎么可以把日志按照一定的格式输出呢?我们看下简单配置

简单配置

package main

import (
	log "github.com/sirupsen/logrus"
	"os"
)

func init() {
	// 设置日志格式为json格式
	log.SetFormatter(&log.JSONFormatter{})

    // 设置日志格式为Text格式
	//log.SetFormatter(&log.TextFormatter{
	//	DisableColors: true,
	//	FullTimestamp: true,
	//})

	// 设置将日志输出到标准输出(默认的输出为stderr,标准错误)
	// 日志消息输出可以是任意的io.writer类型
	log.SetOutput(os.Stdout)

	// 设置日志级别为warn以上
	log.SetLevel(log.WarnLevel)
}

//日志实现

func main()  {
	log.WithFields(log.Fields{
		"request": "test",
	}).Warn("logger-test")
}

输出对应如下:

Logger实例

logger是一种相对高级的用法, 对于一个大型项目, 往往需要一个全局的logrus实例,即logger对象来记录项目所有的日志。

package main

import (
	"github.com/sirupsen/logrus"
	"os"
)
// logrus提供了New()函数来创建一个logrus的实例。
// 项目中,可以创建任意数量的logrus实例。
var log = logrus.New()

//日志实现
func main()  {
	// 为当前logrus实例设置消息的输出,同样地,
	// 可以设置logrus实例的输出到任意io.writer
	log.Out = os.Stdout

	// 为当前logrus实例设置消息输出格式为json格式。
	// 同样地,也可以单独为某个logrus实例设置日志级别和hook,这里不详细叙述。
	log.Formatter = &logrus.JSONFormatter{}

	log.WithFields(logrus.Fields{
		"err": "error",
		"request":   "request",
	}).Info("log-test")
}

Fields

logrus不推荐使用冗长的消息来记录运行信息,它推荐使用Fields来进行精细化的、结构化的信息记录。

log.WithFields(log.Fields{
  "event": event,
  "topic": topic,
  "key": key,
}).Fatal("Failed to send event")

WithFields可以规范使用者按照其提倡的方式记录日志。但是WithFields依然是可选的,因为某些场景下,使用者确实只需要记录仪一条简单的消息。

通常,在一个应用中、或者应用的一部分中,都有一些固定的Field。比如在处理用户http请求时,上下文中,所有的日志都会有request_id和user_ip。为了避免每次记录日志都要使用log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip}),我们可以创建一个logrus.Entry实例,为这个实例设置默认Fields,在上下文中使用这个logrus.Entry实例记录日志即可。

级别日志记录

Logrus 有七个日志记录级别:Trace、Debug、Info、Warning、Error、Fatal 和 Panic。

log.Trace("Something very low level.")
log.Debug("Useful debugging information.")
log.Info("Something noteworthy happened!")
log.Warn("You should probably take a look at this.")
log.Error("Something failed but I'm not quitting.")
// Calls os.Exit(1) after logging
log.Fatal("Bye.")
// Calls panic() after logging
log.Panic("I'm bailing.")

您可以设置日志记录级别Logger,然后它只会记录具有该严重性或高于它的任何记录;

// Will log anything that is info or above (warn, error, fatal, panic). Default.
log.SetLevel(log.InfoLevel)

本文正在参加技术专题18期-聊聊Go语言框架