在go语言中如何记录每个HTTP请求到你的Web服务器、日志记录器?
Go  /  管理员 发布于 1年前   740
在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的内容
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号