在go语言中如何记录每个HTTP请求到你的Web服务器、日志记录器?

2023-06-01 00:00:00 语言 请求 记录器

在go语言中你想记录每一个向你的网络服务器发出的HTTP请求,包括持续时间(开始时间-结束时间)、请求者的IP地址、访问的URI,你还想把日志信息保存到一个文件中,以便以后查看。

当然有专门的日志系统解决方案,但是这种太过复杂繁琐,我只需要简单的请求记录,可以叫日志记录器

如何做到这一点?

注意:

将HTTP请求日志保存到文件中,对于故障排除或协助识别服务器上的攻击者非常有用。

但是,请注意,日志的文件大小会越来越大,需要不时地滚动,以保持文件大小不占用所有的磁盘空间。

对日志越来越大的情况,可以做定时切割日志文件及清空一部分过期日志文件。


解决方案:

创建一个请求记录器函数,并将其封装在HTTP请求复用器上。


示例代码:

 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()
         //将所有的日志信息导向webrequests.log。
         log.SetOutput(logFile)
         mux := http.NewServeMux()
         mux.HandleFunc("/", SayHelloWorld)
         mux.HandleFunc("/bye", SayGoodByeWorld)
         http.ListenAndServe(":8080", RequestLogger(mux))
 }

测试效果

建立并运行上述程序。

将你的浏览器指向 localhost:8080 和 localhost:8080/bye

查看webrequests.log的内容

相关文章