Request logging
Let’s continue in the same vein and add some middleware to log HTTP requests. Specifically, we’re going to use the information logger that we created earlier to record the IP address of the user, and which URL and method are being requested.
Open your middleware.go
file and create a logRequest()
method using the standard middleware pattern, like so:
package main ... func (app *application) logRequest(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { app.infoLog.Printf("%s - %s %s %s", r.RemoteAddr, r.Proto, r.Method, r.URL.RequestURI()) next.ServeHTTP(w, r) }) }
Notice that this time we’re implementing the middleware as a method on application
?
This is perfectly valid to do. Our middleware method has the same signature as before, but because it is a method against application
it also has access to the handler dependencies including the information logger.
Now let’s update our routes.go
file so that the logRequest
middleware is executed first, and for all requests, so that the flow of control (reading from left to right) looks like this:
logRequest ↔ secureHeaders ↔ servemux ↔ application handler
package main import "net/http" func (app *application) routes() http.Handler { mux := http.NewServeMux() fileServer := http.FileServer(http.Dir("./ui/static/")) mux.Handle("/static/", http.StripPrefix("/static", fileServer)) mux.HandleFunc("/", app.home) mux.HandleFunc("/snippet/view", app.snippetView) mux.HandleFunc("/snippet/create", app.snippetCreate) // Wrap the existing chain with the logRequest middleware. return app.logRequest(secureHeaders(mux)) }
Alright… let’s give it a try!
Restart your application, browse around, and then check your terminal window. You should see log output which looks a bit like this:
$ go run ./cmd/web INFO 2022/02/06 09:08:29 Starting server on :4000 INFO 2022/02/06 09:08:31 127.0.0.1:45988 - HTTP/1.1 GET / INFO 2022/02/06 09:08:31 127.0.0.1:45988 - HTTP/1.1 GET /static/css/main.css INFO 2022/02/06 09:08:31 127.0.0.1:45988 - HTTP/1.1 GET /static/js/main.js INFO 2022/02/06 09:08:31 127.0.0.1:45988 - HTTP/1.1 GET /static/img/logo.png INFO 2022/02/06 09:08:31 127.0.0.1:45988 - HTTP/1.1 GET /static/img/favicon.ico INFO 2022/02/06 09:08:34 127.0.0.1:45988 - HTTP/1.1 GET /snippet/view?id=2