gpt4 book ai didi

Golang一日一库之logrus

转载 作者:我是一只小鸟 更新时间:2023-04-17 14:31:19 30 4
gpt4 key购买 nike

前言

之前一篇文章介绍了 日志库zap https://www.cnblogs.com/zichliang/p/17311480.html 毋庸置疑,zap库无论是Golang在项目中 还是生产中都极其优秀的一个数据库,而且他是当今Go最快的日志库 性能最高的日志库。 但是今天缺不是来说他的,今天介绍的是另一款日志库 logrus 虽然 logrus 已经不维护 且不更新,但是个人感觉logrus比zap 要好用很多,不是说性能,是使用的简易程度而言.

logrus介绍

首先贴上github 地址:

https://github.com/sirupsen/logrus 。

logrus相比较zap 没有完整的日志库级别 但是比起自带的logger还是要丰富很多 一共有七种日志库级别 Trace, Debug, Info, Warning, Error, Fatal, Panic.

性能:相别zap 略逊一筹 。

结构化而言:日期时间,级别,信息 。

而他的优缺点则更为明显:

  • 优点在一开始也提及了 就是使用非常简单。
  • 缺点也更加显而易见 性能一般,日志库等级不丰富(其实七个日库等级 一般而言也够用。)

安装

                        
                          go get -u github.com/sirupsen/logrus

                        
                      

简单使用

                        
                          package test

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

func init() {
	logrus.SetReportCaller(false)

	logrus.SetFormatter(&logrus.JSONFormatter{})

	logrus.SetOutput(os.Stdout)

	logrus.SetLevel(logrus.WarnLevel)
}

func TestLog(t *testing.T) {
	//time="2023-04-17T11:06:36+08:00" level=info msg="hello,world" 用户=  "创建时的日志"

	// WithFields从标准记录器创建一个条目,并向其添加多个字段。这只是一个' WithField '的助手,为每个字段调用它一次。注意,它不会记录,直到你调用调试,打印,信息,警告,致命或恐慌的条目返回。
	logger := logrus.WithFields(logrus.Fields{
		"用户": "创建时的日志",
	})
	logger.Info("hello,world")
}


                        
                      

WithFields

WithFields从标准记录器创建一个条目,并向其添加多个字段。 这只是一个' WithField '的助手,为每个字段调用它一次。注意,它不会记录,直到你调用调试,打印,信息,警告,等条目返回。 可以随意调用 。

                        
                          logger := logrus.WithFields(logrus.Fields{
	"用户": "创建时的日志",
})
logger.Trace("Trace 级别的信息")
logger.Info("Info 级别的信息")
logger.Debug("Debug 级别的信息")

logrus.Warn("Warn 级别的信息")
logrus.Error("Error 级别的信息")
logrus.Fatal("Fatal 级别的信息")
logrus.Panic("Panic 级别的信息") // 会报错

                        
                      

SetReportCaller

至于 logrus.SetReportCaller(true) 我们直接看结果 。

                        
                          logrus.SetReportCaller(true)
// time="2023-04-17T11:06:52+08:00" level=info msg="hello,world" func=DoubleCarbon/test.TestLog file="E:/Golang/DoubleCarbon/test/log_test.go:16" 用 户="创建时的日志"

                        
                      
                        
                          logrus.SetReportCaller(false)
// time="2023-04-17T11:06:36+08:00" level=info msg="hello,world" 用户=  "创建时的日志"

                        
                      

SetFormatter

SetFormatter设置标准记录器格式化程序。 以 JSON 格式而不是默认的 ASCII 格式化程序记录.

SetOutput

输出到标准输出而不是默认标准输出 可以是任何io编写器 这里我写的输出到 终端中 也可以输出到文件中 。

SetLevel

仅记录警告严重性或更高级别。 可以任意定义。一般都是定义debug 以上级别的 不然日志太多就没有意义了.

Hooks

gopkg.in/gemnasium/logrus-airbrake-hook.v2 使用上面这个库 可以根据异常日志把日志发送到多个位置。 也可以根据hooks连接到本地的log目录。 官网: https://github.com/gemnasium/logrus-airbrake-hook/tree/v5.0.0 但是感觉讲的有点不清楚 。

安装

go get -u gopkg.in/gemnasium/logrus-airbrake-hook.v4 。

使用

                        
                          package test

import (
	"github.com/sirupsen/logrus"
	airbrake "gopkg.in/gemnasium/logrus-airbrake-hook.v4"
	"testing"
)

func TestLog(t *testing.T) {
	log := logrus.New()
	log.AddHook(airbrake.NewHook(123, "xyz", "production"))
	log.Warn("some logging message")

}

                        
                      
  • logrus.new : 生成一个日志实例
  • NewHook 第一个传参: ProjectID
  • NewHook 第二个传参: ApiKey
  • NewHook 第三个传参: 生产环境 一共有两个 development 还有 production

第一个传参和第二个传参 查遍了资料 也没发现有啥用 第三个传参 我猜是可以和全局变量环境接壤 例如,如果您的应用程序具有全局 变量 ,它是环境的字符串表示形式 可以做 但是感觉意义也不是太大.

                        
                          if Environment == "production" {
    log.SetFormatter(&log.JSONFormatter{})
  } else {
    // The TextFormatter is default, you don't actually have to do this.
    log.SetFormatter(&log.TextFormatter{})
  }

                        
                      

在这一块我认为没有lumberjack 好用.

gin框架使用logrus

直接看官方文档把 。

                        
                          // a gin with logrus demo

var log = logrus.New()

func init() {
	// Log as JSON instead of the default ASCII formatter.
	log.Formatter = &logrus.JSONFormatter{}
	// Output to stdout instead of the default stderr
	// Can be any io.Writer, see below for File example
	f, _ := os.Create("./gin.log")
	log.Out = f
	gin.SetMode(gin.ReleaseMode)
	gin.DefaultWriter = log.Out
	// Only log the warning severity or above.
	log.Level = logrus.InfoLevel
}

func main() {
	// 创建一个默认的路由引擎
	r := gin.Default()
	// GET:请求方式;/hello:请求的路径
	// 当客户端以GET方法请求/hello路径时,会执行后面的匿名函数
	r.GET("/hello", func(c *gin.Context) {
		log.WithFields(logrus.Fields{
			"animal": "walrus",
			"size":   10,
		}).Warn("A group of walrus emerges from the ocean")
		// c.JSON:返回JSON格式的数据
		c.JSON(200, gin.H{
			"message": "Hello world!",
		})
	})
	// 启动HTTP服务,默认在0.0.0.0:8080启动服务
	r.Run()
}

                        
                      

最后此篇关于Golang一日一库之logrus的文章就讲到这里了,如果你想了解更多关于Golang一日一库之logrus的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com