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

Patricia Arquette
リリース: 2024-10-05 14:07:02
オリジナル
482 人が閲覧しました

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


ログイン後にコピー
ロギング ミドルウェアについてさらに詳しく知りたい方は、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 化します。これにより、アプリが移植可能になり、あらゆるマシンまたはクラウド サービスに展開できるようになります。コンテナマジックの準備をしましょう! ?

以上がロギングおよびエラー処理ミドルウェアを Go API に追加するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート