«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Добавление промежуточного ПО для ведения журналов и обработки ошибок в API Go

Добавление промежуточного ПО для ведения журналов и обработки ошибок в API Go

Опубликовано 8 ноября 2024 г.
Просматривать:252

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. Он объясняет, как структурировать многоразовое промежуточное программное обеспечение для различных случаев использования, таких как аутентификация, отслеживание и, конечно же, ведение журналов!

Шаг 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! Это сделает ваше приложение портативным и готовым к развертыванию на любом компьютере или в облачной службе. Приготовьтесь к контейнерному волшебству! ?

Заявление о выпуске Эта статья воспроизведена по адресу: 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