在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中文網其他相關文章!