在go语言中如何记录每个HTTP请求到你的Web服务器、日志记录器?
在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的内容
相关文章