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

Golang中日志使用詳解

 更新時(shí)間:2024年01月19日 08:48:33   作者:莫忘初心丶  
這篇文章記錄了Golang項(xiàng)目中日志使用,以及結(jié)合Gin框架記錄請(qǐng)求日志,文中通過(guò)代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

日志庫(kù)介紹

  1. rotatelogs "github.com/lestrrat-go/file-rotatelogs

  2. github.com/rifflock/lfshook

  3. github.com/sirupsen/logrus
    這三個(gè)包通常被一起使用是為了實(shí)現(xiàn)日志文件的輪轉(zhuǎn)(log rotation)功能。解釋一下它們的作用:

  4. github.com/lestrrat-go/file-rotatelogs

    • 這是一個(gè)用于文件日志輪轉(zhuǎn)的 Go 語(yǔ)言包。它允許你創(chuàng)建按時(shí)間輪轉(zhuǎn)的日志文件,確保日志文件不會(huì)無(wú)限制地增長(zhǎng),而是會(huì)按照一定的規(guī)則進(jìn)行切割,例如按天、按小時(shí)等。
  5. github.com/rifflock/lfshook

    • 這是 Logrus(一個(gè) Go 語(yǔ)言的日志庫(kù))的一個(gè)鉤子(hook)。Logrus 是一個(gè)功能強(qiáng)大的日志庫(kù),而 lfshook 允許你將 Logrus 的日志輸出寫入到文件,并且可以結(jié)合 github.com/lestrrat-go/file-rotatelogs 這個(gè)包,實(shí)現(xiàn)日志文件的定期輪轉(zhuǎn)。
  6. github.com/sirupsen/logrus

    • Logrus 是一個(gè)非常流行的 Go 語(yǔ)言日志庫(kù),提供了豐富的日志功能。它支持日志級(jí)別、字段結(jié)構(gòu)化輸出等特性,使得日志記錄變得更加靈活和可定制。

綜合使用這三個(gè)包的方式,你可以在應(yīng)用程序中使用 Logrus 進(jìn)行日志記錄,并通過(guò) lfshook 將日志輸出到文件,同時(shí)利用 file-rotatelogs 來(lái)管理日志文件的輪轉(zhuǎn),以防止日志文件無(wú)限增長(zhǎng)而導(dǎo)致的存儲(chǔ)問(wèn)題。這樣的組合可以確保你的應(yīng)用程序能夠高效地記錄日志,并在需要時(shí)保持日志文件的可管理性。

簡(jiǎn)單日志記錄

這是一個(gè)簡(jiǎn)單的日志包(clog)的實(shí)現(xiàn),使用 Logrus、file-rotatelogs 和 lfshook 這三個(gè)包來(lái)實(shí)現(xiàn)日志記錄和輪轉(zhuǎn)的功能。

package clog

import (
	"fmt"
	"os"
	"path"
	"time"

	rotatelogs "github.com/lestrrat-go/file-rotatelogs"
	"github.com/rifflock/lfshook"
	"github.com/sirupsen/logrus"
)

// 日志文件路徑和文件名
var (
	logFilePath = "./log/"
	logFileName = "system.log"
)

// Logger 是日志記錄器實(shí)例
var Logger *logrus.Logger

// init 函數(shù)在包被導(dǎo)入時(shí)執(zhí)行,用于初始化日志設(shè)置
func init() {
	// 初始化日志記錄器
	Logger = logrus.New()

	// 設(shè)置日志級(jí)別為 Debug
	Logger.SetLevel(logrus.DebugLevel)

	// 設(shè)置輸出到文件
	fileName := path.Join(logFilePath, logFileName)
	src, err := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY, os.ModeAppend)
	if err != nil {
		fmt.Println("err", err)
	}
	Logger.Out = src

	// 設(shè)置 rotatelogs,實(shí)現(xiàn)日志文件輪轉(zhuǎn)
	logWriter, _ := rotatelogs.New(
		fileName+".%Y%m%d.log",
		rotatelogs.WithLinkName(fileName),
		rotatelogs.WithMaxAge(15*24*time.Hour),
		rotatelogs.WithRotationTime(24*time.Hour),
	)

	// 配置 lfshook,將不同日志級(jí)別的日志寫入同一個(gè)文件
	writeMap := lfshook.WriterMap{
		logrus.InfoLevel:  logWriter,
		logrus.FatalLevel: logWriter,
		logrus.DebugLevel: logWriter,
		logrus.WarnLevel:  logWriter,
		logrus.ErrorLevel: logWriter,
		logrus.PanicLevel: logWriter,
	}

	// 添加 lfshook 到 Logger
	Logger.AddHook(lfshook.NewHook(writeMap, &logrus.TextFormatter{
		TimestampFormat: "2006-01-02 15:04:05",
	}))
}

// Add 函數(shù)用于添加日志記錄
func Add(requestId, info string, err error) {
	if err != nil {
		// 如果有錯(cuò)誤,記錄 Error 級(jí)別的日志
		Logger.WithFields(logrus.Fields{
			"request_id": requestId,
			"info":       info,
			"error":      err.Error(),
		}).Error()
	} else {
		// 如果沒(méi)有錯(cuò)誤,記錄 Info 級(jí)別的日志
		Logger.WithFields(logrus.Fields{
			"request_id": requestId,
			"info":       info,
			"error":      "",
		}).Info()
	}
}
  • logFilePath 和 logFileName 定義了日志文件的路徑和名稱。
  • Logger 是 logrus 的日志記錄器實(shí)例。
  • init 函數(shù)在包被導(dǎo)入時(shí)執(zhí)行,用于初始化 Logger、設(shè)置日志級(jí)別、輸出到文件、配置文件輪轉(zhuǎn)等。
  • rotatelogs.New 創(chuàng)建了一個(gè)按時(shí)間輪轉(zhuǎn)的日志寫入器。
  • lfshook.WriterMap 定義了不同日志級(jí)別對(duì)應(yīng)的寫入器,確保不同級(jí)別的日志寫入到同一個(gè)文件。
  • lfshook.NewHook 創(chuàng)建了一個(gè) lfshook 鉤子,將其添加到 Logger 中。
  • Add 函數(shù)用于添加日志記錄,根據(jù)是否有錯(cuò)誤來(lái)選擇記錄 Info 或 Error 級(jí)別的日志。

結(jié)合Gin框架使用

這是一個(gè)基于 Gin 框架的中間件(LoggerMiddleware),用于記錄請(qǐng)求的相關(guān)信息

package auth

import (
	"encoding/json"
	"fmt"
	"time"

	"go-yinhe-cloud/middleware/clog"
	"go-yinhe-cloud/models"
	"go-yinhe-cloud/pkg/util"

	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
)

// LoggerMiddleware 返回一個(gè) Gin 中間件,用于記錄請(qǐng)求日志
func LoggerMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 記錄請(qǐng)求開(kāi)始時(shí)間
		startTime := time.Now()

		// 處理請(qǐng)求
		c.Next()

		// 記錄請(qǐng)求結(jié)束時(shí)間
		endTime := time.Now()

		// 計(jì)算請(qǐng)求執(zhí)行時(shí)間
		latencyTime := endTime.Sub(startTime)

		// 獲取請(qǐng)求相關(guān)信息
		reqMethod := c.Request.Method        // 請(qǐng)求方式
		reqUrl := c.Request.RequestURI       // 請(qǐng)求路由
		statusCode := c.Writer.Status()      // 狀態(tài)碼
		clientIP := c.ClientIP()             // 請(qǐng)求IP
		header := c.GetHeader("User-Agent") + "@@" + c.GetHeader("token") // 請(qǐng)求頭
		_ = c.Request.ParseMultipartForm(128)
		reqForm := c.Request.Form
		var reqJsonStr string

		// 將請(qǐng)求數(shù)據(jù)轉(zhuǎn)為 JSON 字符串
		if len(reqForm) > 0 {
			reqJsonByte, _ := json.Marshal(reqForm)
			reqJsonStr = string(reqJsonByte)
		}

		// 獲取請(qǐng)求中的 requestId
		requestId := c.GetString("requestId")

		// 獲取 Gin 中間件中的錯(cuò)誤信息
		var errorsStr string
		for _, err := range c.Errors.Errors() {
			errorsStr += err + "; "
		}

		// 記錄請(qǐng)求日志到文件
		clog.Logger.WithFields(logrus.Fields{
			"request_id":   requestId,
			"status_code":  statusCode,
			"latency_time": latencyTime,
			"client_ip":    clientIP,
			"req_method":   reqMethod,
			"ua_token":     header,
			"req_uri":      reqUrl,
			"body":         reqJsonStr,
			"err_str":		errorsStr,
		}).Info()
	}
}
  • LoggerMiddleware 返回一個(gè) Gin 中間件函數(shù)。
  • 記錄請(qǐng)求開(kāi)始時(shí)間和結(jié)束時(shí)間,計(jì)算請(qǐng)求執(zhí)行時(shí)間。
  • 獲取請(qǐng)求的方法、路由、狀態(tài)碼、IP、請(qǐng)求頭等信息。
  • 將請(qǐng)求數(shù)據(jù)轉(zhuǎn)為 JSON 字符串。
  • 獲取 Gin 中間件中的錯(cuò)誤信息,并拼接成字符串。
  • 記錄請(qǐng)求日志到文件,使用 clog.Logger。

以上就是Golang中日志使用詳解的詳細(xì)內(nèi)容,更多關(guān)于Golang日志使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • go語(yǔ)言使用中提示%!(NOVERB)的解決方案

    go語(yǔ)言使用中提示%!(NOVERB)的解決方案

    o語(yǔ)言的設(shè)計(jì)目標(biāo)是提供一種簡(jiǎn)單易用的編程語(yǔ)言,同時(shí)保持高效性和可擴(kuò)展性,它支持垃圾回收機(jī)制,具有強(qiáng)大的并發(fā)編程能力,可以輕松處理大規(guī)模的并發(fā)任務(wù),Go語(yǔ)言還擁有豐富的標(biāo)準(zhǔn)庫(kù)和活躍的開(kāi)發(fā)社區(qū),使得開(kāi)發(fā)者能夠快速構(gòu)建出高質(zhì)量的應(yīng)用程序,需要的朋友可以參考下
    2023-10-10
  • Go 語(yǔ)言中靜態(tài)類型和動(dòng)態(tài)類型的使用

    Go 語(yǔ)言中靜態(tài)類型和動(dòng)態(tài)類型的使用

    本文主要介紹了Go語(yǔ)言中的靜態(tài)類型和動(dòng)態(tài)類型,靜態(tài)類型在編譯時(shí)確定,提供了類型安全,性能優(yōu)化和代碼清晰,而動(dòng)態(tài)類型在運(yùn)行時(shí)確定,提供了更高的靈活性,但可能引發(fā)運(yùn)行時(shí)錯(cuò)誤,下面就來(lái)介紹一下,感興趣的可以了解一下
    2024-10-10
  • Go語(yǔ)言排序算法之插入排序與生成隨機(jī)數(shù)詳解

    Go語(yǔ)言排序算法之插入排序與生成隨機(jī)數(shù)詳解

    從這篇文章開(kāi)始將帶領(lǐng)大家學(xué)習(xí)Go語(yǔ)言的經(jīng)典排序算法,比如插入排序、選擇排序、冒泡排序、希爾排序、歸并排序、堆排序和快排,二分搜索,外部排序和MapReduce等,本文將先詳細(xì)介紹插入排序,并給大家分享了go語(yǔ)言生成隨機(jī)數(shù)的方法,下面來(lái)一起看看吧。
    2017-11-11
  • golang進(jìn)行簡(jiǎn)單權(quán)限認(rèn)證的實(shí)現(xiàn)

    golang進(jìn)行簡(jiǎn)單權(quán)限認(rèn)證的實(shí)現(xiàn)

    本文主要介紹了golang簡(jiǎn)單權(quán)限認(rèn)證的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 使用go語(yǔ)言解析xml的實(shí)現(xiàn)方法(必看篇)

    使用go語(yǔ)言解析xml的實(shí)現(xiàn)方法(必看篇)

    下面小編就為大家?guī)?lái)一篇使用go語(yǔ)言解析xml的實(shí)現(xiàn)方法(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • go mod 使用舊版本 版本號(hào)指定方式

    go mod 使用舊版本 版本號(hào)指定方式

    這篇文章主要介紹了go mod 使用舊版本 版本號(hào)指定方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • 為什么GO不支持循環(huán)引用

    為什么GO不支持循環(huán)引用

    這篇文章主要介紹的是為什么GO不支持循環(huán)引用,學(xué)習(xí) Go 語(yǔ)言的開(kāi)發(fā)者越來(lái)越多了,很多小伙伴在使用時(shí),就會(huì)遇到種種不理解的問(wèn)題,其中一點(diǎn)就是包的循環(huán)引用的報(bào)錯(cuò),下main文章我們一起來(lái)看看學(xué)習(xí)原因
    2021-10-10
  • Go語(yǔ)言參數(shù)傳遞是傳值還是傳引用

    Go語(yǔ)言參數(shù)傳遞是傳值還是傳引用

    Go?語(yǔ)言到底是傳值(值傳遞),還是傳引用(引用傳遞)?本文就詳細(xì)介紹一下,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Golang中的Unicode與字符串示例詳解

    Golang中的Unicode與字符串示例詳解

    這篇文章主要給大家介紹了關(guān)于Golang中Unicode與字符串的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Golang具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • golang實(shí)現(xiàn)對(duì)JavaScript代碼混淆

    golang實(shí)現(xiàn)對(duì)JavaScript代碼混淆

    在Go語(yǔ)言中,你可以使用一些工具來(lái)混淆JavaScript代碼,一個(gè)常用的工具是Terser,它可以用于壓縮和混淆JavaScript代碼,你可以通過(guò)Go語(yǔ)言的`os/exec`包來(lái)調(diào)用Terser工具,本文給通過(guò)一個(gè)簡(jiǎn)單的示例給大家介紹一下,感興趣的朋友可以參考下
    2024-01-01

最新評(píng)論

哈巴河县| 岳阳县| 大同市| 鄯善县| 商洛市| 常熟市| 常熟市| 寻甸| 绍兴市| 宣城市| 乌拉特中旗| 法库县| 山西省| 师宗县| 苗栗县| 师宗县| 额济纳旗| 阿克陶县| 抚顺市| 荆州市| 乾安县| 贡觉县| 厦门市| 会同县| 石城县| 湖口县| 平原县| 青神县| 大理市| 高密市| 金乡县| 渭源县| 曲周县| 张家港市| 共和县| 扬中市| 靖宇县| 波密县| 察哈| 潢川县| 洛阳市|