首页  >  文章  >  后端开发  >  将日志记录和错误处理中间件添加到您的 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