Logging 404 Errors in HTTP File Server
When using http.FileServer to serve files from a directory, it's not immediately clear how to log HTTP 404 errors (file not found) on the server console. While the browser may display a "404 page not found" message, this information is not automatically logged by http.FileServer.
To address this, we need to extend the functionality of the handlers returned by both http.StripPrefix and http.FileServer. We can do this by wrapping them in custom handlers or handler functions and registering the wrappers.
Our wrapper implementation will invoke the wrapped handler. After the wrapped handler returns, the wrapper can inspect the HTTP response status code. If it indicates an error (specifically HTTP 404 Not Found), the wrapper can log this appropriately.
However, http.ResponseWriter does not support retrieving the response status code. To overcome this, we'll create a custom StatusRespWr that wraps http.ResponseWriter and stores the status code for later retrieval.
Here's the implementation of 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>
Next, we'll wrap the 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>
Finally, in the main function, we create a file server, wrap it, and register the wrapped handler:
<code class="go">http.HandleFunc("/o/", wrapHandler(http.StripPrefix("/o", http.FileServer(http.Dir("/test"))))) panic(http.ListenAndServe(":8181", nil))</code>
If a request is made for a non-existent file, the following message will be logged:
2015/12/01 11:47:40 Error status code: 404 when serving path: /o/sub/b.txt2
The above is the detailed content of How to Log 404 Errors in Go\'s HTTP File Server?. For more information, please follow other related articles on the PHP Chinese website!