Home  >  Article  >  Backend Development  >  How can I log 404 errors when serving files with `http.FileServer` in Go?

How can I log 404 errors when serving files with `http.FileServer` in Go?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-26 19:39:29746browse

How can I log 404 errors when serving files with `http.FileServer` in Go?

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!

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