之前一篇文章介紹了 紀錄檔庫zap https://www.cnblogs.com/zichliang/p/17311480.html
毋庸置疑,zap庫無論是Golang在專案中 還是生產中都極其優秀的一個資料庫,而且他是當今Go最快的紀錄檔庫 效能最高的紀錄檔庫。
但是今天缺不是來說他的,今天介紹的是另一款紀錄檔庫 logrus
雖然 logrus 已經不維護 且不更新,但是個人感覺logrus比zap 要好用很多,不是說效能,是使用的簡易程度而言。
首先貼上github 地址:
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從標準記錄器建立一個條目,並向其新增多個欄位。
這只是一個' 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 級別的資訊") // 會報錯
至於 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設定標準記錄器格式化程式。
以 JSON 格式而不是預設的 ASCII 格式化程式記錄。
輸出到標準輸出而不是預設標準輸出
可以是任何io編寫器
這裡我寫的輸出到 終端中 也可以輸出到檔案中
僅記錄警告嚴重性或更高階別。
可以任意定義。一般都是定義debug 以上級別的
不然紀錄檔太多就沒有意義了。
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")
}
第一個傳參和第二個傳參 查遍了資料 也沒發現有啥用
第三個傳參 我猜是可以和全域性變數環境接壤
例如,如果您的應用程式具有全域性 變數 ,它是環境的字串表示形式 可以做
但是感覺意義也不是太大。
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 好用。
直接看官方檔案把
// 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()
}