Logging 404 Errors for Http.FileServer
When serving files with http.FileServer, it can be useful to log instances where a requested file does not exist, resulting in a 404 status code. However, the default http.FileServer handler does not provide this functionality.
Extending the Functionality
To log 404 errors, you can extend the functionality of the http.FileServer handler. This can be achieved by wrapping the handler with a custom http.Handler or http.HandlerFunc.
Wrapping the Handler
The wrapper handler will invoke the original http.FileServer handler and then inspect the HTTP response status code. If it is an error (specifically 404 Not Found), it can log the error appropriately.
Response Status Code Wrapper
As http.ResponseWriter does not support reading the response status code directly, you can create a wrapper that stores the status code when it is set.
<code class="go">type StatusRespWr struct { http.ResponseWriter // Embeds http.ResponseWriter status int } func (w *StatusRespWr) WriteHeader(status int) { w.status = status // Store the status for later use w.ResponseWriter.WriteHeader(status) }</code>
Handler Wrapper
With the response status code wrapper in place, you can create a handler wrapper that logs errors:
<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 indicate errors log.Printf("Error status code: %d when serving path: %s", srw.status, r.RequestURI) } } }</code>
Registering the Wrapped Handler
Finally, you can register the wrapped handler as a route in your HTTP server:
<code class="go">http.HandleFunc("/o/", wrapHandler(http.FileServer(http.Dir("/test"))))</code>
Example Output
When a non-existent file is requested, the wrapped handler will log an error message to the console:
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 can I log 404 errors when serving files with `http.FileServer` in Go?. For more information, please follow other related articles on the PHP Chinese website!