學習 Gin 總結(2020.12.30-31)
阿新 • • 發佈:2020-12-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
到中介軟體Set
的time
,把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,
)
}
}
這時候,有啟動日誌和執行日誌都在不同的檔案記錄下來,在相應的檔案上就可以檢視相關的記錄,進行系統的執行監控。