>  기사  >  백엔드 개발  >  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))
    })
}


로깅 미들웨어에 대해 더 자세히 알아보는 데 관심이 있는 분들은 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 내부 서버 오류" 메시지만 표시됩니다. ?


이것이 왜 중요합니까?

  1. 로깅은 버그를 추적하고 API 동작을 모니터링하는 데 도움이 됩니다. 문제가 발생하면 정확히 어느 엔드포인트에 도달했는지, 요청에 걸린 시간은 얼마나 되는지 알 수 있습니다.

  2. 오류 처리는 예상치 못한 일이 발생했을 때 API가 충돌하는 것을 방지합니다. 대신 정상적으로 복구되어 클라이언트에 깨끗한 오류 메시지를 보냅니다.


다음은 무엇입니까?

다음에는 한 단계 더 발전하여

Go API를 Docker화하겠습니다! 이렇게 하면 앱을 이식할 수 있고 모든 컴퓨터나 클라우드 서비스에 배포할 수 있습니다. 컨테이너의 마법을 경험해보세요! ?

위 내용은 Go API에 로깅 및 오류 처리 미들웨어 추가의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.