Home  >  Article  >  Backend Development  >  How to Log 404 Errors in Go\'s HTTP File Server?

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

Patricia Arquette
Patricia ArquetteOriginal
2024-10-26 20:40:29937browse

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

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn