Golang一日一庫之logrus

始識發表於2023-04-17

前言

之前一篇文章介紹了 日誌庫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

https://github.com/sirupsen/logrus/wiki/Hooks
使用上面這些庫 包含了可以所有可以連線logrus的hooks

舉例

因為一般來說要傳送日誌 肯定不可能選擇 MySQL這種資料庫 ,因為日誌執行起來量是很大的,所以一般來說
會選擇 es 或者redis 或者mongodb 這種非關聯式資料庫。
這裡就簡單舉個redis的例子

安裝

logrus-redis-hook

go get github.com/rogierlommers/logrus-redis-hook

簡易使用

package main

import (
	logredis "github.com/rogierlommers/logrus-redis-hook"
	"io/ioutil"

	"github.com/sirupsen/logrus"
)

func init() {
	hookConfig := logredis.HookConfig{
		Host:     "localhost",
		Key:      "my_redis_key",
		Format:   "v0",
		App:      "my_app_name",
		Port:     6379,
		Hostname: "my_app_hostname", // will be sent to field @source_host
		DB:       0,                 // optional
		TTL:      3600,
		Password: "*****", // 寫你的密碼
	}

	hook, err := logredis.NewHook(hookConfig)
	if err == nil {
		logrus.AddHook(hook)
	} else {
		logrus.Errorf("logredis error: %q", err)
	}
}

func main() {
	// when hook is injected succesfully, logs will be sent to redis server
	logrus.Info("just some info logging...")

	// we also support log.WithFields()
	logrus.WithFields(logrus.Fields{
		"animal": "walrus",
		"foo":    "bar",
		"this":   "that"}).
		Info("additional fields are being logged as well")

	// If you want to disable writing to stdout, use setOutput
	logrus.SetOutput(ioutil.Discard)
	logrus.Info("This will only be sent to Redis")
}

如圖所示

直接就在redis裡寫入了日誌資訊

如果失敗 如下圖所示

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()
}

相關文章