「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > ロギングおよびエラー処理ミドルウェアを Go API に追加する

ロギングおよびエラー処理ミドルウェアを Go API に追加する

2024 年 11 月 8 日に公開
ブラウズ:221

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))
    })
}


ロギング ミドルウェアについてさらに詳しく知りたい方は、Go でのロギング ミドルウェアの作成に関する Matt Silverlock の素晴らしいガイドを参照することをお勧めします。彼は、認証、トレース、そしてもちろんログ記録など、さまざまなユースケースに合わせて再利用可能なミドルウェアを構築する方法を詳しく解説しています。

ステップ 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))
}



ステップ 4: テストしてみますか?

すべてが機能していることを確認するには、API を起動します:


go run main.go


次に、エンドポイント (/books など) のいずれかにアクセスして、ターミナルを確認してください。次のようなログが表示されるはずです:


Started GET /books
Completed in 1.2ms


エラーがある場合は、次のように表示されます:


Error occurred: some error details


ただし、ユーザーにはクリーンな「500 Internal Server Error」メッセージのみが表示されます。 ?


これがなぜ重要なのでしょうか?

  1. ロギングは、バグを追跡し、API の動作を監視するのに役立ちます。何か問題が発生した場合は、どのエンドポイントがヒットしたか、リクエストにかかった時間が正確にわかります。

  2. エラー処理は、予期せぬ事態が発生したときに API がクラッシュするのを防ぎます。代わりに、正常に回復し、クライアントにクリーンなエラー メッセージを送信します。


次は何ですか?

次回は、次のレベルに進み、Go API を Docker 化します!これにより、アプリが移植可能になり、あらゆるマシンまたはクラウド サービスに展開できるようになります。コンテナマジックの準備をしましょう! ?

リリースステートメント この記事は次の場所に転載されています: https://dev.to/neelp03/adding-logging-and-error-handling-middleware-to-your-go-api-2f33?1 侵害がある場合は、study_golang@163 までご連絡ください。 .comを削除してください
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3