Melog 404 Ralat dalam Pelayan Fail HTTP
Apabila menggunakan http.FileServer untuk menyampaikan fail dari direktori, cara untuk log tidak jelas dengan serta-merta Ralat HTTP 404 (fail tidak ditemui) pada konsol pelayan. Walaupun penyemak imbas mungkin memaparkan mesej "halaman 404 tidak ditemui", maklumat ini tidak dilog secara automatik oleh http.FileServer.
Untuk menangani perkara ini, kami perlu memperluaskan fungsi pengendali yang dikembalikan oleh kedua-dua http.StripPrefix dan http.FileServer. Kita boleh melakukannya dengan membungkusnya dalam fungsi pengendali atau pengendali tersuai dan mendaftarkan pembalut.
Pelaksanaan pembalut kami akan menggunakan pengendali yang dibalut. Selepas pengendali yang dibalut kembali, pembalut boleh memeriksa kod status respons HTTP. Jika ia menunjukkan ralat (khususnya HTTP 404 Not Found), pembungkus boleh log ini dengan sewajarnya.
Walau bagaimanapun, http.ResponseWriter tidak menyokong mendapatkan semula kod status respons. Untuk mengatasinya, kami akan mencipta StatusRespWr tersuai yang membungkus http.ResponseWriter dan menyimpan kod status untuk mendapatkan semula kemudian.
Berikut ialah pelaksanaan 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>
Seterusnya, kami' akan membalut 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>
Akhir sekali, dalam fungsi utama, kami mencipta pelayan fail, membungkusnya dan mendaftarkan pengendali yang dibalut:
<code class="go">http.HandleFunc("/o/", wrapHandler(http.StripPrefix("/o", http.FileServer(http.Dir("/test"))))) panic(http.ListenAndServe(":8181", nil))</code>
Jika permintaan dibuat untuk fail yang tidak wujud, mesej berikut akan dilog:
2015/12/01 11:47:40 Error status code: 404 when serving path: /o/sub/b.txt2
Atas ialah kandungan terperinci Bagaimana untuk Log Ralat 404 dalam Pelayan Fail HTTP Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!