首頁  >  文章  >  後端開發  >  如何在 Go 的 HTTP 檔案伺服器中記錄 404 錯誤?

如何在 Go 的 HTTP 檔案伺服器中記錄 404 錯誤?

Patricia Arquette
Patricia Arquette原創
2024-10-26 20:40:29937瀏覽

How to Log 404 Errors in Go's HTTP File Server?

在HTTP 檔案伺服器中記錄404 錯誤

使用http.FileServer 提供目錄中的檔案時,無法立即清楚如何記錄伺服器控制台上出現HTTP 404 錯誤(找不到檔案)。雖然瀏覽器可能會顯示「404 頁面找不到」訊息,但 http.FileServer 不會自動記錄此資訊。

為了解決此問題,我們需要擴充 http.StripPrefix 傳回的處理程序的功能和 http.FileServer。我們可以透過將它們包裝在自訂處理程序或處理程序函數中並註冊包裝器來做到這一點。

我們的包裝器實作將呼叫包裝的處理程序。包裝處理程序傳回後,包裝器可以檢查 HTTP 回應狀態碼。如果它指示錯誤(特別是 HTTP 404 Not Found),則包裝器可以適當地記錄此錯誤。

但是,http.ResponseWriter 不支援檢索回應狀態碼。為了克服這個問題,我們將建立一個自訂 StatusRespWr 來包裝 http.ResponseWriter 並儲存狀態碼以供以後檢索。

這是StatusRespWr 的實作:

<code class="go">type StatusRespWr struct {
    http.ResponseWriter // We embed http.ResponseWriter
    status int
}

func (w *StatusRespWr) WriteHeader(status int) {
    w.status = status // Store the status for our own use
    w.ResponseWriter.WriteHeader(status)
}</code>

接下來,我們' ll 包裝http.Handler:

<code class="go">func wrapHandler(h http.Handler) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        srw := &StatusRespWr{ResponseWriter: w}
        h.ServeHTTP(srw, r)
        if srw.status >= 400 { // 400+ codes are error codes
            log.Printf("Error status code: %d when serving path: %s", srw.status, r.RequestURI)
        }
    }
}</code>

最後,在main 函數中,我們建立一個文件伺服器,包裝它,並註冊包裝的處理程序:

<code class="go">http.HandleFunc("/o/", wrapHandler(http.StripPrefix("/o", http.FileServer(http.Dir("/test")))))
panic(http.ListenAndServe(":8181", nil))</code>

如果請求是為不存在的文件創建的,將記錄以下訊息:

2015/12/01 11:47:40 Error status code: 404 when serving path: /o/sub/b.txt2

以上是如何在 Go 的 HTTP 檔案伺服器中記錄 404 錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn