」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 將日誌記錄和錯誤處理中間件新增至您的 Go API

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

發佈於2024-11-08
瀏覽:938

Adding Logging and Error Handling Middleware to Your Go API

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

好吧,夥計們,我們已經運行了 Go API,添加了 JWT 身份驗證,甚至將其連接到 PostgreSQL 資料庫。但我們還沒完成!本週,我們將透過添加用於日誌記錄的自訂中間件,使我們的API 更聰明以及更多開發人員友好 ]錯誤處理

中間件又是什麼? ?

中間件就像您最喜歡的俱樂部的保鑣——它會在請求到達您的 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 在發生意外情況時崩潰。相反,它會正常恢復並向客戶端發送乾淨的錯誤訊息。


接下來是什麼?

下次,我們將把事情提升到一個新的水平並dockerize我們的Go API!這將使您的應用程式可移植並準備好部署在任何電腦或雲端服務上。準備好施展容器魔法吧! ?

版本聲明 本文轉載於:https://dev.to/neelp03/adding-logging-and-error-handling-middleware-to-your-go-api-2f33?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何有效率地將資料從SQL Server 2005遷移到MySQL?
    如何有效率地將資料從SQL Server 2005遷移到MySQL?
    將資料從SQL Server 2005 匯出到MySQL在資料遷移領域,從SQL Server 2005 到MySQL 的過渡可能會帶來挑戰。一項特別艱鉅的任務是提取儲存在近 300 個表中的大量資料並將其轉換為相容的 MySQL 資料庫。 使用 bcp 的局限性,例如無效的 CSV 格式以及需要手...
    程式設計 發佈於2024-12-22
  • 為什麼我無法透過 Ruby on Rails 3 應用程式中的套接字檔案連接到 MySQL 伺服器?
    為什麼我無法透過 Ruby on Rails 3 應用程式中的套接字檔案連接到 MySQL 伺服器?
    使用套接字連接在 Ruby on Rails 3 中建立 MySQL 連線在 macOS 上的 Ruby on Rails 3環境中管理資料庫連線時,使用者嘗試執行遷移時可能會遇到以下錯誤:「無法透過套接字'/tmp/mysql.sock'連接到本機MySQL伺服器」 (2)」。此錯...
    程式設計 發佈於2024-12-22
  • 從程式碼到聊天:幫我免費部署我的 Node.js 和 React 應用程式!
    從程式碼到聊天:幫我免費部署我的 Node.js 和 React 應用程式!
    大家好, 我很高興分享我已經使用 Node.js、React 和 Socket.io 開發了一個聊天應用程式! ?這是一次令人難以置信的學習經歷,我對它的結果感到自豪。該應用程式允許即時訊息傳遞,並且我已經實現了用戶身份驗證和聊天室等功能。 現在我已經建立了它,我希望免費部署它,但我可以使用一些指...
    程式設計 發佈於2024-12-22
  • 為什麼 `mysqli_query()` 回傳「警告:mysqli_query() 期望參數 1 為 MySQLi,給定 null」?
    為什麼 `mysqli_query()` 回傳「警告:mysqli_query() 期望參數 1 為 MySQLi,給定 null」?
    理解「警告:mysqli_query() 期望參數1 為MySQLi,在中給出null」錯誤在您嘗試建立自訂CMS,您遇到以下錯誤訊息:「警告:mysqli_query() 期望參數1 為MySQLi, null Give in"錯誤原因此錯誤表示執行 SQL 查詢的 mysqli_que...
    程式設計 發佈於2024-12-22
  • 為什麼介面對於掌握 Java 中的物件導向程式設計至關重要?
    為什麼介面對於掌握 Java 中的物件導向程式設計至關重要?
    介面:增強 OOP 的橋樑在 Java 世界中,了解介面的原因、內容和方式對於掌握物件導向程式設計。這裡有一個全面的細分:什麼是介面? 介面是純抽象的集合-沒有實作和最終欄位的抽象方法。這意味著介面定義契約而不是提供程式碼片段。 為什麼要使用介面? 介面提供了幾個好處:合約執行: 他們確保實施類別遵...
    程式設計 發佈於2024-12-22
  • 像 V8 和 JavaScriptCore 這樣的 JavaScript 引擎是否使用字串實習?
    像 V8 和 JavaScriptCore 這樣的 JavaScript 引擎是否使用字串實習?
    JavaScript引擎會使用String Interning嗎? 簡介:在程式設計中,string interning是指重複使用現有字串物件的過程而不是為相同的字串建立新的字串。這種優化技術旨在減少記憶體使用並提高效能。問題是,常見的 JavaScript 引擎,包括 V8 和 WebKit 的...
    程式設計 發佈於2024-12-22
  • 如何擷取 Go 範本輸出並將其指派給變數?
    如何擷取 Go 範本輸出並將其指派給變數?
    在Go 中捕獲模板輸出在Go 模板中,捕獲子模板的輸出或直接將其分配給變量是默認不支持。不過,這可以透過註冊自訂函數並使用位元組緩衝區接收模板的結果來實現。 自訂函數註冊要擷取範本輸出,請註冊Template.Funcs() 的函數將範本名稱作為參數並以字串形式傳回範本的輸出:func execTe...
    程式設計 發佈於2024-12-22
  • Go 的短路評估會影響條件語句的效能嗎?
    Go 的短路評估會影響條件語句的效能嗎?
    Go 中的短路求值在程式設計中,短路求值是一種僅在需要確定周圍語句的結果時才對錶達式求值的技術。這通常用在條件語句中,如果先前的條件已經為 false,則無需對多個條件進行求值。 Go 實作邏輯運算子(&& 和 ||)的短路求值,與許多其他程式設計類似語言。這意味著在 if 語句中,解釋器將從左到右...
    程式設計 發佈於2024-12-22
  • HTML 格式標籤
    HTML 格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2024-12-22
  • 我應該使用哪些 g++ 警告標誌來進行全面的 C++ 程式碼分析?
    我應該使用哪些 g++ 警告標誌來進行全面的 C++ 程式碼分析?
    使用g 進行C 編譯的徹底而詳細的警告標誌Gcc 提供了一套全面的警告標誌來幫助開發人員檢測潛在問題他們的代碼。若要在C 中啟用徹底且詳細的警告,請考慮以下建議:基本警告:-迂腐:遵守嚴格C語言標準。 -Wall:啟動所有普遍接受的warnings.-Wextra:將警告範圍擴大到-Wall之外。 ...
    程式設計 發佈於2024-12-22
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-12-22
  • Visual Studio 是否完全支援現代 C/C++ 標準?
    Visual Studio 是否完全支援現代 C/C++ 標準?
    Visual Studio 對現代C/C 標準的支援在軟體開發領域,C 和C 程式語言隨著引入C99 和C 11 等新標準,可望帶來一系列有益的功能。然而,問題出現了:這些進步會進入微軟的 Visual Studio IDE(整合開發環境)嗎? 微軟的立場微軟支持新 C 的官方立場/C 標準相當平淡...
    程式設計 發佈於2024-12-22
  • 方法鏈如何增強 Java 程式碼操作?
    方法鏈如何增強 Java 程式碼操作?
    Java 中的方法鏈:實作程式碼操作的流暢性要在Java 中實作方法鏈,請修改方法簽章以傳回“this “ 目的。這允許方法調用的無縫鏈接,如下所示:public Dialog setMessage(String message) { // Message setting logic ...
    程式設計 發佈於2024-12-22
  • 如何從 Matplotlib 圖中刪除科學記數法和偏移量?
    如何從 Matplotlib 圖中刪除科學記數法和偏移量?
    從Matplotlib 圖中刪除科學記數法您有一個帶有科學記數法和軸偏移量的圖,並且您想要消除它們。 停用偏移偏移量與科學記數法分開,並加入軸上顯示的數字。要停用它,請使用:plt.ticklabel_format(useOffset=False)停用科學記數法要阻止科學記數法,請使用: ]plt....
    程式設計 發佈於2024-12-22
  • 如何在 Java 中將位元組數組轉換為字串並返回位元組數組?
    如何在 Java 中將位元組數組轉換為字串並返回位元組數組?
    Java 中位元組數組轉字串並傳回位元組數組假設您有一個初始byte[] 數組,需要將其轉換為字串表示形式。隨後,您想要將該字串轉換回 byte[] 陣列。這種轉換對於各種場景下的資料傳輸和處理至關重要。 要將 byte[] 陣列轉換為字串,可以使用 Arrays.toString() 方法。此方法...
    程式設計 發佈於2024-12-22

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3