自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

為你的 Go API 添加日志記錄和錯誤處理中間件

開發(fā) 前端
在 main? 函數(shù)中,我們首先創(chuàng)建了一個 mux.NewRouter? 對象,它用于路由請求。然后,我們使用 r.Use? 函數(shù)全局應用了 loggingMiddleware? 和 errorHandlingMiddleware。這樣,所有請求都會經(jīng)過這兩個中間件。

在構(gòu)建 Go API 時,日志記錄和錯誤處理是至關(guān)重要的組成部分,它們可以幫助你調(diào)試代碼、監(jiān)控 API 行為并為用戶提供友好的錯誤提示。中間件提供了一種優(yōu)雅的方式來實現(xiàn)這些功能,它允許你在請求到達你的 API 端點之前攔截請求并執(zhí)行一些操作。

本文將引導你逐步添加日志記錄和錯誤處理中間件到你的 Go API 中,使你的 API 更加健壯、易于維護和用戶友好。

什么是中間件?

中間件就像你最喜歡的夜總會里的保安,它會在請求到達你的 API 端點之前攔截請求。你可以使用中間件來檢查身份驗證(比如我們在 JWT 中所做的那樣)、記錄信息或在出現(xiàn)錯誤時進行處理。

今天,我們將構(gòu)建一個中間件,它可以:

  • 記錄:每個傳入請求,以便我們知道誰在敲打我們的 API 的門。
  • 處理錯誤:優(yōu)雅地處理錯誤,這樣你的用戶就不會看到那些難看的 500 錯誤。

讓我們深入研究吧!

第一步:創(chuàng)建日志記錄中間件

日志記錄是你調(diào)試和了解 API 中發(fā)生的事情時最好的朋友。我們將創(chuàng)建一個中間件,它記錄每個傳入請求——方法、URL 和所用時間。

import (
 "log"
 "net/http"
 "time"
)

func loggingMiddleware(next http.Handler) http.Handler {
 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  start := time.Now()

  // 記錄方法和請求的 URL
  log.Printf("Started %s %s", r.Method, r.URL.Path)

  // 調(diào)用鏈中的下一個處理程序
  next.ServeHTTP(w, r)

  // 記錄所用時間
  log.Printf("Completed in %v", time.Since(start))
 })
}

這段代碼定義了一個名為 loggingMiddleware 的函數(shù),它接受一個 http.Handler 作為參數(shù),并返回一個新的 http.Handler。這個新處理程序包含一個匿名函數(shù),它會在每個請求到達時執(zhí)行。在函數(shù)中,我們首先記錄了請求的開始時間,然后記錄了請求的方法和 URL。接下來,我們調(diào)用 next.ServeHTTP 將請求傳遞給鏈中的下一個處理程序。最后,我們記錄了請求的處理時間。

第二步:錯誤處理中間件

讓我們談談錯誤。錯誤會發(fā)生,對吧?但是,與其讓它們導致崩潰或發(fā)送模糊的錯誤消息,不如讓我們優(yōu)雅地處理它們。

func errorHandlingMiddleware(next http.Handler) http.Handler {
 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  defer func() {
   if err := recover(); err != nil {
    // 記錄錯誤并發(fā)送用戶友好的消息
    log.Printf("Error occurred: %v", err)
    http.Error(w, "Internal Server Error", http.StatusInternalServerError)
   }
  }()
  next.ServeHTTP(w, r)
 })
}

這段代碼定義了一個名為 errorHandlingMiddleware 的函數(shù),它接受一個 http.Handler 作為參數(shù),并返回一個新的 http.Handler。這個新處理程序包含一個匿名函數(shù),它會在每個請求到達時執(zhí)行。在函數(shù)中,我們使用 defer 關(guān)鍵字來確保在函數(shù)返回之前執(zhí)行一個匿名函數(shù)。這個匿名函數(shù)使用 recover() 函數(shù)來捕獲任何恐慌,并記錄錯誤信息,然后向客戶端發(fā)送一個 500 錯誤。

第三步:在你的 API 中集成中間件

現(xiàn)在我們已經(jīng)構(gòu)建了日志記錄和錯誤處理中間件,讓我們將它們連接到我們的 API。我們將全局應用它們,這樣每個請求都會被記錄,并且錯誤會被捕獲。

import (
 "fmt"
 "log"
 "net/http"

 "github.com/gorilla/mux"
)

// ... 其他代碼 ...

func main() {
 // ... 其他代碼 ...

 r := mux.NewRouter()

 // 全局應用中間件
 r.Use(loggingMiddleware)
 r.Use(errorHandlingMiddleware)

 // ... 其他代碼 ...

 fmt.Println("Server started on port :8000")
 log.Fatal(http.ListenAndServe(":8000", r))
}

在 main 函數(shù)中,我們首先創(chuàng)建了一個 mux.NewRouter 對象,它用于路由請求。然后,我們使用 r.Use 函數(shù)全局應用了 loggingMiddleware 和 errorHandlingMiddleware。這樣,所有請求都會經(jīng)過這兩個中間件。

第四步:測試它

為了確保一切正常,啟動你的 API:

go run main.go

現(xiàn)在,嘗試訪問你的任何端點(例如 /books)并檢查你的終端。你應該看到類似以下的日志:

Started GET /books
Completed in 1.2ms

如果出現(xiàn)錯誤,你會看到:

Error occurred: some error details

但是,你的用戶只會看到一條干凈的“500 內(nèi)部服務器錯誤”消息。??

為什么這很重要?

  1. 日志記錄有助于你跟蹤錯誤和監(jiān)控 API 的行為。如果出現(xiàn)問題,你會確切地知道哪個端點被訪問以及請求花費了多長時間。
  2. 錯誤處理可以防止你的 API 在出現(xiàn)意外情況時崩潰。相反,它會優(yōu)雅地恢復并向客戶端發(fā)送一條清晰的錯誤消息。
責任編輯:武曉燕 來源: 源自開發(fā)者
相關(guān)推薦

2023-10-26 15:49:53

Go日志

2024-05-06 12:30:51

Go語言中間件

2022-11-18 07:54:02

Go中間件項目

2021-09-13 07:53:31

Go錯誤處理

2015-12-21 14:56:12

Go語言Http網(wǎng)絡(luò)協(xié)議

2021-10-06 19:03:35

Go中間件Middleware

2021-04-29 09:02:44

語言Go 處理

2014-11-17 10:05:12

Go語言

2013-12-12 10:55:21

2022-10-25 08:01:17

洋蔥模型Koa

2020-06-28 09:20:33

代碼開發(fā)Go

2022-07-14 08:17:59

中間件微服務開發(fā)

2023-11-27 07:10:06

日志中間件

2016-11-11 21:00:46

中間件

2021-02-11 08:21:02

中間件開發(fā)CRUD

2011-05-24 15:10:48

2024-01-05 08:17:53

FiberGolang路由

2023-12-06 07:14:28

前端API中間件

2025-03-31 00:29:44

2022-09-05 08:55:15

Go2提案語法
點贊
收藏

51CTO技術(shù)棧公眾號