最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang logrus日志框架實(shí)例詳解

 更新時(shí)間:2023年08月02日 09:54:21   作者:RSFeegg  
logrus是一個(gè)可插拔的、結(jié)構(gòu)化的日志框架,這篇文章主要介紹了golang logrus日志框架實(shí)例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

logrus簡(jiǎn)介

logrus是一個(gè)可插拔的、結(jié)構(gòu)化的日志框架。
logrus擁有六種日志級(jí)別:debug、info、warn、error、fatal和panic
可擴(kuò)展的Hook機(jī)制:
允許使用者通過(guò)hook的方式將日志分發(fā)到任意地方,如本地文件系統(tǒng)、標(biāo)準(zhǔn)輸出、logstash、elasticsearch或者mq等,或者通過(guò)hook定義日志內(nèi)容和格式等。
logrus內(nèi)置了兩種日志格式,JSONFormatter和TextFormatter,如果這兩個(gè)格式不滿(mǎn)足需求,可以自己動(dòng)手實(shí)現(xiàn)接口Formatter,來(lái)定義自己的日志格式。
logrus鼓勵(lì)通過(guò)Field機(jī)制進(jìn)行精細(xì)化的、結(jié)構(gòu)化的日志記錄,而不是通過(guò)冗長(zhǎng)的消息來(lái)記錄日志。

寫(xiě)一個(gè)簡(jiǎn)單的例子

package main
import (
  log "github.com/sirupsen/logrus"
)
func main() {
  log.WithFields(log.Fields{
    "animal": "walrus",
  }).Info("A walrus appears")
}

高級(jí)用法

logger是一種相對(duì)高級(jí)的用法, 對(duì)于一個(gè)大型項(xiàng)目, 往往需要一個(gè)全局的logrus實(shí)例,即logger對(duì)象來(lái)記錄項(xiàng)目所有的日志。

一些默認(rèn)的初始化

package main
import (
  log "github.com/sirupsen/logrus"
)
func main() {
	var log = logrus.New()
	// 設(shè)置日志級(jí)別為xx以及以上
	 log.SetLevel(logrus.InfoLevel)
	 //JSON在生產(chǎn)中通常只在使用Splunk或Logstash等工具進(jìn)行日志聚合時(shí)才有用。
	 // 設(shè)置日志格式為json格式
	// log.SetFormatter(&logrus.JSONFormatter{
	// 	// PrettyPrint: true,//格式化json
	// 	TimestampFormat: "2006-01-02 15:04:05",//時(shí)間格式化
	// })
	log.SetFormatter(&logrus.TextFormatter{
		TimestampFormat: "2006-01-02 15:04:05",//時(shí)間格式化
	})
	// 設(shè)置將日志輸出到標(biāo)準(zhǔn)輸出(默認(rèn)的輸出為stderr,標(biāo)準(zhǔn)錯(cuò)誤)
	// 日志消息輸出可以是任意的io.writer類(lèi)型
	log.SetOutput(os.Stdout)
    // 初始化一些公共參數(shù)
	loginit:=log.WithFields(logrus.Fields{
		"animal": "walrus",
	})
	//輸出日志
	log.Info("A walrus appears")
}

在日志中打印文件行號(hào)等信息

log.SetReportCaller(true)可以打印行號(hào)

package main
import (
  "github.com/sirupsen/logrus"
  "os"
  "runtime"
	"time"
)
func main() {
// logger是一種相對(duì)高級(jí)的用法, 對(duì)于一個(gè)大型項(xiàng)目, 往往需要一個(gè)全局的logrus實(shí)例,即logger對(duì)象來(lái)記錄項(xiàng)目所有的日志。
	var log = logrus.New()
	log.SetReportCaller(true) // 顯示行號(hào)等信息
	 // 設(shè)置日志級(jí)別為xx以及以上
	 log.SetLevel(logrus.InfoLevel)
	log.SetFormatter(&logrus.TextFormatter{
		TimestampFormat: "2006-01-02 15:04:05",//時(shí)間格式化
	})
	// 設(shè)置將日志輸出到標(biāo)準(zhǔn)輸出(默認(rèn)的輸出為stderr,標(biāo)準(zhǔn)錯(cuò)誤)
	// 日志消息輸出可以是任意的io.writer類(lèi)型
	log.SetOutput(os.Stdout)
	// 初始化一些公共參數(shù)
	loginit:=log.WithFields(logrus.Fields{
		"animal": "walrus",
	})
	log.Info("A walrus appears")
}

golang logrus日志框架

logrus自定義log 日志

廢話(huà)不多說(shuō),直接舉個(gè)栗子

package main
import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
	"net/http"
	"os"
)
var log=logrus.New()//創(chuàng)建一個(gè)log實(shí)例
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)建一個(gè)log日志文件
    if err!=nil{
		fmt.Println("創(chuàng)建文件/打開(kāi)文件失?。?)
		return err
    }
    log.Out=file//設(shè)置log的默認(rèn)文件輸出
    gin.SetMode(gin.ReleaseMode)//發(fā)布版本
    gin.DefaultWriter=log.Out//gin框架自己記錄的日志也會(huì)輸出
    log.Level=logrus.InfoLevel//設(shè)置文件級(jí)別
    return nil
}
func main() {
	err:=initLogrus()
	if err!=nil{
		fmt.Println(err)
		return
	}
	r := gin.Default()
	r.GET("/logrus", func(c *gin.Context) {
		//定義寫(xiě)入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 文件。如果沒(méi)安裝import那些依賴(lài)。直接go mod tidy;

上效果

在這里插入圖片描述

在這里插入圖片描述

logrus設(shè)置最大保存時(shí)間、設(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://文件存儲(chǔ)路徑
	logFileName="system.log"
)
func main() {
	r := gin.Default()
	//添加中間件,主要實(shí)現(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)建一個(gè)log日志文件
	if err!=nil{
		fmt.Println(err)
	}
	//實(shí)例化
	logger:=logrus.New()
	//設(shè)置日志級(jí)別
	logger.SetLevel(logrus.DebugLevel)
	logger.Out=file//設(shè)置log的默認(rèn)文件輸出
	logWriter,err:=rotatelogs.New(
		//分割后的文件名稱(chēng)
		fileName+".%Y%m%d.log",
		//生成軟鏈接,指向最新日志文件
		rotatelogs.WithLinkName(fileName),
		//設(shè)置最大保存時(shí)間7天
		rotatelogs.WithMaxAge(7*24*time.Hour),
		//設(shè)置日志切割時(shí)間間隔(1天)
		rotatelogs.WithRotationTime(1*time.Hour),
	)
	//hook機(jī)制的設(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()
		//請(qǐng)求方法
		method:=c.Request.Method
		//請(qǐng)求路由
		reqUrl:=c.Request.RequestURI
		//狀態(tài)碼
		statusCode:=c.Writer.Status()
		//請(qǐng)求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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文詳解golang延時(shí)任務(wù)的實(shí)現(xiàn)

    一文詳解golang延時(shí)任務(wù)的實(shí)現(xiàn)

    這篇文章主要為大家介紹了golang延時(shí)任務(wù)的實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 使用Go開(kāi)發(fā)硬件驅(qū)動(dòng)程序的流程步驟

    使用Go開(kāi)發(fā)硬件驅(qū)動(dòng)程序的流程步驟

    Golang是一種簡(jiǎn)潔、高效的編程語(yǔ)言,它的強(qiáng)大并發(fā)性能和豐富的標(biāo)準(zhǔn)庫(kù)使得它成為了開(kāi)發(fā)硬件驅(qū)動(dòng)的理想選擇,在本文中,我們將探討如何使用Golang開(kāi)發(fā)硬件驅(qū)動(dòng)程序,并提供一個(gè)實(shí)例來(lái)幫助你入門(mén),需要的朋友可以參考下
    2023-11-11
  • Go語(yǔ)言中的自定義錯(cuò)誤類(lèi)型

    Go語(yǔ)言中的自定義錯(cuò)誤類(lèi)型

    本文主要介紹了Go語(yǔ)言中的自定義錯(cuò)誤類(lèi)型,通過(guò)定義結(jié)構(gòu)體并實(shí)現(xiàn)Error接口,創(chuàng)建包含參數(shù)和錯(cuò)誤信息的自定義錯(cuò)誤,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-05-05
  • Golang使用gzip壓縮字符減少redis等存儲(chǔ)占用的實(shí)現(xiàn)

    Golang使用gzip壓縮字符減少redis等存儲(chǔ)占用的實(shí)現(xiàn)

    本文主要介紹了Golang使用gzip壓縮字符減少redis等存儲(chǔ)占用的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Golang并發(fā)編程之GMP模型詳解

    Golang并發(fā)編程之GMP模型詳解

    傳統(tǒng)的并發(fā)編程模型是基于線(xiàn)程和共享內(nèi)存的同步訪(fǎng)問(wèn)控制的,共享數(shù)據(jù)受鎖的保護(hù),線(xiàn)程將爭(zhēng)奪這些鎖以訪(fǎng)問(wèn)數(shù)據(jù)。本文將介紹Go并發(fā)編程中的GMP模型,感興趣的可以了解一下
    2023-03-03
  • 在?Golang?中使用?Cobra?創(chuàng)建?CLI?應(yīng)用

    在?Golang?中使用?Cobra?創(chuàng)建?CLI?應(yīng)用

    這篇文章主要介紹了在?Golang?中使用?Cobra?創(chuàng)建?CLI?應(yīng)用,來(lái)看下?Cobra?的使用,這里我們使用的?go1.13.3?版本,使用?Go?Modules?來(lái)進(jìn)行包管理,需要的朋友可以參考下
    2022-01-01
  • Go語(yǔ)言中處理JSON數(shù)據(jù)的編碼和解碼的方法

    Go語(yǔ)言中處理JSON數(shù)據(jù)的編碼和解碼的方法

    在Go語(yǔ)言中,處理JSON數(shù)據(jù)的編碼和解碼主要依賴(lài)于標(biāo)準(zhǔn)庫(kù)中的encoding/json包,這個(gè)包提供了兩個(gè)核心的函數(shù):Marshal和Unmarshal,本文給大家介紹了Go語(yǔ)言中處理JSON數(shù)據(jù)的編碼和解碼的方法,需要的朋友可以參考下
    2024-04-04
  • go語(yǔ)言中使用timer的常用方式

    go語(yǔ)言中使用timer的常用方式

    這篇文章主要介紹了go語(yǔ)言中使用timer的常用方式,實(shí)例分析了三種常用的使用timer的方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • golangci-lint安裝與Goland集成問(wèn)題

    golangci-lint安裝與Goland集成問(wèn)題

    這篇文章主要介紹了golangci-lint安裝與Goland集成,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • Go使用sync.Pool提高性能的代碼示例

    Go使用sync.Pool提高性能的代碼示例

    在高性能應(yīng)用程序中,頻繁的內(nèi)存分配和回收是性能瓶頸的常見(jiàn)原因之一,Go 語(yǔ)言提供了 sync.Pool 類(lèi)型,它可以用來(lái)存儲(chǔ)和重用臨時(shí)對(duì)象,本文將詳細(xì)介紹如何在 Go 中使用 sync.Pool,并通過(guò)實(shí)際代碼示例來(lái)展示其對(duì)性能的提升效果,需要的朋友可以參考下
    2024-04-04

最新評(píng)論

加查县| 陵水| 都昌县| 突泉县| 郧西县| SHOW| 驻马店市| 苍南县| 潜山县| 保靖县| 安顺市| 福鼎市| 恭城| 丰原市| 尉氏县| 武穴市| 诸城市| 平遥县| 化州市| 沙坪坝区| 武夷山市| 扶风县| 绥阳县| 侯马市| 保靖县| 花莲县| 安乡县| 嘉荫县| 宾阳县| 阿合奇县| 夹江县| 华亭县| 宜阳县| 鲜城| 青浦区| 广宁县| 兴业县| 三台县| 墨脱县| 城步| 承德市|