Golang一日一庫之logrus

2023-04-17 12:00:46

前言

之前一篇文章介紹了 紀錄檔庫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()
}