在Go语言中,使用标准库log记录API请求需搭建一个HTTP服务器,在处理器中调用logRequest函数记录请求的IP、方法、URL、请求头和请求体。注意请求体只能读取一次,需通过ioutil包的ReadAll函数读取后重置r.Body字段,以便后续处理复用。
在Go语言中,记录API请求可以通过标准库log实现,虽然第三方库如logrus、zap提供了更丰富的功能,但本文先从标准库开始,介绍最基本的做法。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
首先搭建一个最简单的HTTP服务器:
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/", handleRequest)
log.Fatal(http.ListenAndServe(":8080", nil))
}
func handleRequest(w http.ResponseWriter, r *http.Request) {
logRequest(r)
fmt.Fprintf(w, "Hello, World!")
}
然后在handleRequest中调用logRequest来记录请求信息:
func logRequest(r *http.Request) {
log.Printf("Request: %s %s %s", r.RemoteAddr, r.Method, r.URL)
log.Printf("Headers: %v", r.Header)
log.Printf("Body: %s", r.Body)
}
上述示例会打印每个请求的IP、HTTP方法、URL、请求头和请求体。但存在一个问题:r.Body只能读取一次,读取后内容即被消耗。为了让后续处理逻辑能够再次读取请求体,需要自定义一个io.ReadCloser,将Body缓存起来。
package main
import (
"bytes"
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
http.HandleFunc("/", handleRequest)
log.Fatal(http.ListenAndServe(":8080", nil))
}
func handleRequest(w http.ResponseWriter, r *http.Request) {
logRequest(r)
fmt.Fprintf(w, "Hello, World!")
}
func logRequest(r *http.Request) {
log.Printf("Request: %s %s %s", r.RemoteAddr, r.Method, r.URL)
log.Printf("Headers: %v", r.Header)
bodyBytes, err := ioutil.ReadAll(r.Body)
if err != nil {
log.Printf("Error reading body: %v", err)
return
}
defer r.Body.Close()
log.Printf("Body: %s", bodyBytes)
// 重置请求体,让后续处理器能再次读取
r.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
}
这样一来,标准库log就能稳定地记录API请求。如果未来觉得标准库功能不足——例如需要分级日志或结构化输出——再考虑logrus或zap也不迟。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述