首頁  >  文章  >  後端開發  >  將日誌記錄和錯誤處理中間件新增至您的 Go API

將日誌記錄和錯誤處理中間件新增至您的 Go API

Patricia Arquette
Patricia Arquette原創
2024-10-05 14:07:02434瀏覽

Adding Logging and Error Handling Middleware to Your Go API

快速注意:如果您查看了我之前關於 JWT 身份驗證的帖子並註意到一些渲染問題,那麼這些問題現已修復!請務必再看一遍,因為這些範例是建立在該教程之上的。 :)

好了,夥計們,我們已經運行了 Go API,添加了 JWT 身份驗證,甚至將其連接到 PostgreSQL 資料庫。但我們還沒完成!本週,我們將更上一層樓,透過添加用於日誌記錄和更聰明以及更多開發人員友善 >錯誤處理

中間件又是什麼? ?

中間件就像您最喜歡的俱樂部的保鑣——它會在請求到達您的 API 端點之前攔截它們。您可以使用中間件來檢查身份驗證(就像我們對 JWT 所做的那樣)、記錄資訊或在出現問題時處理錯誤。

今天,我們將建構以下中間件:

  • 日誌:每個傳入的請求,以便我們知道誰在敲我們的 API 的門。
  • 處理錯誤:優雅地,這樣你的使用者就不會看到那些難看的 500 錯誤。
讓我們深入探討一下!


第 1 步:建立日誌記錄中間件?

在偵錯和了解 API 中發生的情況時,日誌記錄是您最好的朋友。我們將建立一個中間件來記錄通過的每個請求 - 方法、URL 和所使用的時間。


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

        // Log the method and the requested URL
        log.Printf("Started %s %s", r.Method, r.URL.Path)

        // Call the next handler in the chain
        next.ServeHTTP(w, r)

        // Log how long it took
        log.Printf("Completed in %v", time.Since(start))
    })
}


對於有興趣深入研究日誌中間件的人,我建議您查看 Matt Silverlock 關於用 Go 編寫日誌中間件的精彩指南。他詳細介紹瞭如何為各種用例建立可重複使用中間件,例如身份驗證、跟踪,當然還有日誌記錄!

第 2 步:錯誤處理中間件?

我們來談錯誤。錯誤總是會發生,對嗎?但與其讓它們導致崩潰或發送模糊的錯誤訊息,不如讓我們優雅地處理它們。


func errorHandlingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        defer func() {
            if err := recover(); err != nil {
                // Log the error and send a user-friendly message
                log.Printf("Error occurred: %v", err)
                http.Error(w, "Internal Server Error", http.StatusInternalServerError)
            }
        }()
        next.ServeHTTP(w, r)
    })
}



步驟 3:將中間件整合到您的 API 中?

現在我們已經建立了日誌記錄和錯誤處理中間件,讓我們將它們連接到我們的 API。我們將在全球範圍內應用它們,以便記錄每個請求並捕獲錯誤。


func main() {
    db = connectDB()
    defer db.Close()

    r := mux.NewRouter()

    // Apply middleware globally
    r.Use(loggingMiddleware)
    r.Use(errorHandlingMiddleware)

    r.HandleFunc("/login", login).Methods("POST")
    r.Handle("/books", authenticate(http.HandlerFunc(getBooks))).Methods("GET")
    r.Handle("/books", authenticate(http.HandlerFunc(createBook))).Methods("POST")

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



第四步:測試一下?

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


go run main.go


現在,嘗試點擊任何端點(例如 /books)並檢查您的終端。您應該看到以下日誌:


Started GET /books
Completed in 1.2ms


如果發生錯誤,您會看到:


Error occurred: some error details


但是您的使用者只會看到一條乾淨的「500 內部伺服器錯誤」訊息。 ?


為什麼這很重要?

  1. 日誌記錄可協助您追蹤錯誤並監控 API 的行為。如果出現問題,您將確切地知道哪個端點被命中以及請求花費了多長時間。

  2. 錯誤處理 可防止您的 API 在發生意外情況時崩潰。相反,它會正常恢復並向客戶端發送乾淨的錯誤訊息。


接下來是什麼?

下次,我們將把事情提升到一個新的水平,並

對我們的 Go API 進行 docker 化!這將使您的應用程式可移植並準備好部署在任何電腦或雲端服務上。準備好施展容器魔法吧! ?

以上是將日誌記錄和錯誤處理中間件新增至您的 Go API的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn