Golang : How to log each HTTP request to your web server?
Problem:
You want to log each HTTP request made to your web server complete with duration (start time - end time), requester IP address, URI accessed and you also want to save the log messages into a file for viewing later.
How to do that?
NOTE: Saving HTTP requests log to file can be useful for troubleshooting purpose or assist in identifying attackers on your server. However, do take note that the log's file size will grow and needs to be rolled-over from time to time to keep the filesize from taking up all the disk space.
Solution:
Create a request logger function and wrap it on the HTTP request multiplexer.
Here you go!
package main
import (
"log"
"net/http"
"os"
"time"
)
func RequestLogger(targetMux http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
targetMux.ServeHTTP(w, r)
// log request by who(IP address)
requesterIP := r.RemoteAddr
log.Printf(
"%s\t\t%s\t\t%s\t\t%v",
r.Method,
r.RequestURI,
requesterIP,
time.Since(start),
)
})
}
func SayGoodByeWorld(w http.ResponseWriter, r *http.Request) {
html := "Good Bye World"
w.Write([]byte(html))
}
func SayHelloWorld(w http.ResponseWriter, r *http.Request) {
html := "Hello World"
w.Write([]byte(html))
}
func main() {
fileName := "webrequests.log"
// https://www.socketloop.com/tutorials/golang-how-to-save-log-messages-to-file
logFile, err := os.OpenFile(fileName, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
panic(err)
}
defer logFile.Close()
// direct all log messages to webrequests.log
log.SetOutput(logFile)
mux := http.NewServeMux()
mux.HandleFunc("/", SayHelloWorld)
mux.HandleFunc("/bye", SayGoodByeWorld)
http.ListenAndServe(":8080", RequestLogger(mux))
}
Build and run the program above.
Point your browser to
localhost:8080
andlocalhost:8080/bye
See the content of
webrequests.log
References:
https://www.socketloop.com/tutorials/golang-how-to-save-log-messages-to-file
https://www.socketloop.com/tutorials/create-file-golang
https://stackoverflow.com/questions/26184465/go-add-logging-to-each-router
See also : Golang : Routes multiplexer routing example with regular expression control
By Adam Ng
IF you gain some knowledge or the information here solved your programming problem. Please consider donating to the less fortunate or some charities that you like. Apart from donation, planting trees, volunteering or reducing your carbon footprint will be great too.
Advertisement
Tutorials
+8.6k Linux/Unix : fatal: the Postfix mail system is already running
+8.4k Golang : Count leading or ending zeros(any item of interest) example
+4.4k Golang : Converting individual Jawi alphabet to Rumi(Romanized) alphabet example
+9.5k Golang : Scramble and unscramble text message by randomly replacing words
+31.8k Golang : How to convert(cast) string to IP address?
+7k Fix sudo yum hang problem with no output or error messages
+6.5k CodeIgniter : form input set_value cause " to become & quot
+9.1k Golang : Go as a script or running go with shebang/hashbang style
+5.8k CodeIgniter/PHP : Remove empty lines above RSS or ATOM xml tag
+22.1k Golang : Use TLS version 1.2 and enforce server security configuration over client
+12.8k Golang : Send data to /dev/null a.k.a blackhole with ioutil.Discard