golang logrus日志框架實例詳解
logrus簡介
logrus是一個可插拔的、結(jié)構(gòu)化的日志框架。
logrus擁有六種日志級別:debug、info、warn、error、fatal和panic
可擴展的Hook機制:
允許使用者通過hook的方式將日志分發(fā)到任意地方,如本地文件系統(tǒng)、標(biāo)準(zhǔn)輸出、logstash、elasticsearch或者mq等,或者通過hook定義日志內(nèi)容和格式等。
logrus內(nèi)置了兩種日志格式,JSONFormatter和TextFormatter,如果這兩個格式不滿足需求,可以自己動手實現(xiàn)接口Formatter,來定義自己的日志格式。
logrus鼓勵通過Field機制進行精細(xì)化的、結(jié)構(gòu)化的日志記錄,而不是通過冗長的消息來記錄日志。
寫一個簡單的例子
package main
import (
log "github.com/sirupsen/logrus"
)
func main() {
log.WithFields(log.Fields{
"animal": "walrus",
}).Info("A walrus appears")
}高級用法
logger是一種相對高級的用法, 對于一個大型項目, 往往需要一個全局的logrus實例,即logger對象來記錄項目所有的日志。
一些默認(rèn)的初始化
package main
import (
log "github.com/sirupsen/logrus"
)
func main() {
var log = logrus.New()
// 設(shè)置日志級別為xx以及以上
log.SetLevel(logrus.InfoLevel)
//JSON在生產(chǎn)中通常只在使用Splunk或Logstash等工具進行日志聚合時才有用。
// 設(shè)置日志格式為json格式
// log.SetFormatter(&logrus.JSONFormatter{
// // PrettyPrint: true,//格式化json
// TimestampFormat: "2006-01-02 15:04:05",//時間格式化
// })
log.SetFormatter(&logrus.TextFormatter{
TimestampFormat: "2006-01-02 15:04:05",//時間格式化
})
// 設(shè)置將日志輸出到標(biāo)準(zhǔn)輸出(默認(rèn)的輸出為stderr,標(biāo)準(zhǔn)錯誤)
// 日志消息輸出可以是任意的io.writer類型
log.SetOutput(os.Stdout)
// 初始化一些公共參數(shù)
loginit:=log.WithFields(logrus.Fields{
"animal": "walrus",
})
//輸出日志
log.Info("A walrus appears")
}在日志中打印文件行號等信息
log.SetReportCaller(true)可以打印行號
package main
import (
"github.com/sirupsen/logrus"
"os"
"runtime"
"time"
)
func main() {
// logger是一種相對高級的用法, 對于一個大型項目, 往往需要一個全局的logrus實例,即logger對象來記錄項目所有的日志。
var log = logrus.New()
log.SetReportCaller(true) // 顯示行號等信息
// 設(shè)置日志級別為xx以及以上
log.SetLevel(logrus.InfoLevel)
log.SetFormatter(&logrus.TextFormatter{
TimestampFormat: "2006-01-02 15:04:05",//時間格式化
})
// 設(shè)置將日志輸出到標(biāo)準(zhǔn)輸出(默認(rèn)的輸出為stderr,標(biāo)準(zhǔn)錯誤)
// 日志消息輸出可以是任意的io.writer類型
log.SetOutput(os.Stdout)
// 初始化一些公共參數(shù)
loginit:=log.WithFields(logrus.Fields{
"animal": "walrus",
})
log.Info("A walrus appears")
}golang logrus日志框架
logrus自定義log 日志
廢話不多說,直接舉個栗子
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/sirupsen/logrus"
"net/http"
"os"
)
var log=logrus.New()//創(chuàng)建一個log實例
func initLogrus()error{
log.Formatter=&logrus.JSONFormatter{}//設(shè)置為json格式的日志
file,err:=os.OpenFile("./gin_log.log",os.O_CREATE|os.O_WRONLY|os.O_APPEND,0644)//創(chuàng)建一個log日志文件
if err!=nil{
fmt.Println("創(chuàng)建文件/打開文件失?。?)
return err
}
log.Out=file//設(shè)置log的默認(rèn)文件輸出
gin.SetMode(gin.ReleaseMode)//發(fā)布版本
gin.DefaultWriter=log.Out//gin框架自己記錄的日志也會輸出
log.Level=logrus.InfoLevel//設(shè)置文件級別
return nil
}
func main() {
err:=initLogrus()
if err!=nil{
fmt.Println(err)
return
}
r := gin.Default()
r.GET("/logrus", func(c *gin.Context) {
//定義寫入log日志的信息
log.WithFields(logrus.Fields{
"url":c.Request.RequestURI,
"method":c.Request.Method,
"params":c.Query("name"),
"IP":c.ClientIP(),
}).Info()
resData:= struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data interface{} `json:"data"`
}{http.StatusOK,"響應(yīng)成功","OK"}
c.JSON(http.StatusOK,resData)
})
r.Run(":9090")
}
# 碼完直接go run 某go 文件。如果沒安裝import那些依賴。直接go mod tidy;上效果


logrus設(shè)置最大保存時間、設(shè)置日志切割時間間隔等
package main
import (
"fmt"
"github.com/gin-gonic/gin"
rotatelogs "github.com/lestrrat-go/file-rotatelogs"
"github.com/rifflock/lfshook"
"github.com/sirupsen/logrus"
"net/http"
"os"
"path"
"time"
)
var (
logFilePath="./"http://文件存儲路徑
logFileName="system.log"
)
func main() {
r := gin.Default()
//添加中間件,主要實現(xiàn)log日志的生成
r.Use(logMiddleware())
r.GET("/logrus2", func(c *gin.Context) {
c.JSON(http.StatusOK,gin.H{
"code":200,
"msg":"響應(yīng)成功",
"data":"ok",
})
})
r.Run(":9090")
}
func logMiddleware() gin.HandlerFunc{
//日志文件
fileName := path.Join(logFilePath, logFileName)
file,err:=os.OpenFile(fileName,os.O_CREATE|os.O_WRONLY|os.O_APPEND,0644)//創(chuàng)建一個log日志文件
if err!=nil{
fmt.Println(err)
}
//實例化
logger:=logrus.New()
//設(shè)置日志級別
logger.SetLevel(logrus.DebugLevel)
logger.Out=file//設(shè)置log的默認(rèn)文件輸出
logWriter,err:=rotatelogs.New(
//分割后的文件名稱
fileName+".%Y%m%d.log",
//生成軟鏈接,指向最新日志文件
rotatelogs.WithLinkName(fileName),
//設(shè)置最大保存時間7天
rotatelogs.WithMaxAge(7*24*time.Hour),
//設(shè)置日志切割時間間隔(1天)
rotatelogs.WithRotationTime(1*time.Hour),
)
//hook機制的設(shè)置
writerMap:=lfshook.WriterMap{
logrus.InfoLevel: logWriter,
logrus.FatalLevel: logWriter,
logrus.DebugLevel: logWriter,
logrus.WarnLevel: logWriter,
logrus.ErrorLevel: logWriter,
logrus.PanicLevel: logWriter,
}
//給logrus添加hook
logger.AddHook(lfshook.NewHook(writerMap,&logrus.JSONFormatter{
TimestampFormat: "2006-01-02 15:04:05",
}))
return func(c *gin.Context) {
c.Next()
//請求方法
method:=c.Request.Method
//請求路由
reqUrl:=c.Request.RequestURI
//狀態(tài)碼
statusCode:=c.Writer.Status()
//請求ip
clientIp:=c.ClientIP()
logger.WithFields(logrus.Fields{
"status_code":statusCode,
"client_ip":clientIp,
"req_method":method,
"req_url":reqUrl,
}).Info()
}
}到此這篇關(guān)于golang logrus日志框架的文章就介紹到這了,更多相關(guān)golang logrus日志框架內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang內(nèi)存泄漏詳解之原因、檢測與修復(fù)過程
本文詳細(xì)介紹了Golang中的內(nèi)存泄漏問題,包括內(nèi)存泄漏的定義、分類、影響以及預(yù)防和修復(fù)方法,通過使用Golang自帶的性能分析工具和火焰圖工具,可以有效地檢測和定位內(nèi)存泄漏的代碼路徑,合理的代碼設(shè)計和定期的代碼審查也是預(yù)防內(nèi)存泄漏的關(guān)鍵2024-12-12
golang使用http client發(fā)起get和post請求示例
這篇文章主要介紹了golang使用http client發(fā)起get和post請求示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
golang?使用sort.slice包實現(xiàn)對象list排序
這篇文章主要介紹了golang?使用sort.slice包實現(xiàn)對象list排序,對比sort跟slice兩種排序的使用方式區(qū)別展開內(nèi)容,需要的小伙伴可以參考一下2022-03-03
golang實現(xiàn)單點登錄系統(tǒng)(go-sso)
這篇文章主要介紹了golang實現(xiàn)單點登錄系統(tǒng)(go-sso),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06

