1. 程式人生 > 實用技巧 >學習 Gin 總結(2020.12.30-31)

學習 Gin 總結(2020.12.30-31)

2020.12.30 問題總結

中介軟體

context.Next()

原始碼註釋:

// Next should be used only inside middleware.
// It executes the pending handlers in the chain inside the calling handler.

只能在中介軟體中使用的函式,它在呼叫處理程式內的鏈中執行掛起的處理程式。

也就是暫時會阻塞中介軟體的執行,去執行處理請求函式。處理完畢請求函式後,再回來執行中介軟體剩餘部分的操作,進行後續處理。

例子

// MiddleWare 宣告自定義中介軟體 ,返回一個處理函式
func MiddleWare() gin.HandlerFunc {
	//返回一個輸出當地時間的處理函式
	return func(context *gin.Context) {
		now := time.Now()
		fmt.Print("請求時間為:")
		fmt.Println(now)
		//執行處理函式
		context.Next()
		// 處理函式執行完畢後,中介軟體執行後續部分
		// Set 放入資料到上下文 context
		context.Set("time",now)
	}
}
// UseMiddleWare 測試使用自定義中介軟體
func UseMiddleWare(c *gin.Context)  {
   // Get 拿到中介軟體放置的資料
   getTime, _ := c.Get("time")
   //返回 JSON
   c.JSON(http.StatusOK,gin.H{"time":getTime})
}

這裡可以簡單驗證一下,在請求中需要Get到中介軟體Settime,把Set操作放在context.Next()後,這時候請求處理是Get不到time的。

正確寫法,在context.Next()前執行Set()寫入time,這時候處理函式Get

才能拿到資料。

// MiddleWare 宣告自定義中介軟體 ,返回一個處理函式
func MiddleWare() gin.HandlerFunc {
	//返回一個輸出當地時間的處理函式
	return func(context *gin.Context) {
		now := time.Now()
		// Set 放入資料到上下文 context
		context.Set("time",now)
		//執行處理函式
		context.Next()
		// 處理函式執行完畢後,中介軟體執行後續部分
		fmt.Print("請求時間為:")
		fmt.Println(now)
	}
}

2020.12.31 問題總結

記錄日誌

檔案或控制檯形式寫入

// Logging 記錄日誌處理方法
// 記錄日誌並持久化到磁碟
// @fileName 檔案路徑+檔名,不填寫路徑,則以檔名儲存在工程檔案根目錄下
func Logging(fileName string) {
	//		採用模式0666(任何人都可讀寫,不可執行)
	file, err := os.OpenFile(fileName, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
	if err != nil {
		fmt.Println("建立日誌檔案出錯,err :", err)
	}
	//同時將日誌寫入檔案和控制檯,引數可選:支援檔案+控制檯,控制檯,檔案 三種
	gin.DefaultWriter = io.MultiWriter(file, os.Stdout)
}

上面方法並不能記錄執行日誌,只能記錄啟動日誌。

因此下面改用Logru進行記錄執行日誌。

使用 Logrus

GitHub 上一個開源的日誌記錄專案( github.com/sirupsen/logrus )

這次採用註冊全域性中介軟體的方式,進行整個程式的日誌記錄。

// LogrusLog 註冊該中介軟體,使用 Logrus 記錄日誌並進行持久化,儲存到磁碟
func LogrusLog() gin.HandlerFunc {
	//建立檔案進行日誌檔案的持久化
	file, err := os.OpenFile("Logrus.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
	if err != nil {
		fmt.Println("建立日誌檔案出錯,err :", err)
	}
	//建立一個日誌記錄例項
	logger := logrus.New()
	// 輸出設定
	logger.Out = file
	//設定日誌級別
	logger.SetLevel(logrus.DebugLevel)
	//設定日誌格式
	logger.SetFormatter(&logrus.TextFormatter{})
	return func(c *gin.Context) {
		// 開始時間
		startTime := time.Now()
		// 處理請求
		c.Next()
		// 結束時間
		endTime := time.Now()
		// 執行時間
		latencyTime := endTime.Sub(startTime)
		// 請求方式
		reqMethod := c.Request.Method
		// 請求路由
		reqUri := c.Request.RequestURI
		// 狀態碼
		statusCode := c.Writer.Status()
		// 請求IP
		clientIP := c.ClientIP()
		// 日誌格式
		logger.Infof("| %3d | %13v | %15s | %s | %s |",
			statusCode,
			latencyTime,
			clientIP,
			reqMethod,
			reqUri,
		)
	}
}

這時候,有啟動日誌執行日誌都在不同的檔案記錄下來,在相應的檔案上就可以檢視相關的記錄,進行系統的執行監控。