在Golang中,记录请求日志通常是通过使用中间件来实现的。这里是一个简单的示例,展示了如何使用Golang的"net/http"包和"log"包来记录HTTP请求日志。
首先,我们需要创建一个自定义的日志记录器。这个记录器将负责将请求信息写入日志文件。
package main
import (
"log"
"os"
"time"
)
type Logger struct {
*log.Logger
}
func NewLogger(logFile string) *Logger {
f, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Fatalf("error opening log file: %v", err)
}
logger := log.New(f, "", log.LstdFlags)
return &Logger{logger}
}
func (l *Logger) LogRequest(r *http.Request, status int, duration time.Duration) {
l.Printf("%s %s %s %v %v", r.RemoteAddr, r.Method, r.URL.Path, status, duration)
}
接下来,我们需要创建一个中间件函数,该函数将在每个请求处理程序之前和之后执行。在这个函数中,我们将记录请求的开始时间、结束时间和状态码。
func LoggingMiddleware(logger *Logger, next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
recorder := &responseRecorder{ResponseWriter: w, status: http.StatusOK}
next.ServeHTTP(recorder, r)
duration := time.Since(start)
logger.LogRequest(r, recorder.status, duration)
})
}
type responseRecorder struct {
http.ResponseWriter
status int
}
func (r *responseRecorder) WriteHeader(code int) {
r.status = code
r.ResponseWriter.WriteHeader(code)
}
最后,我们需要在主函数中设置HTTP服务器,并将我们的中间件添加到处理程序链中。
func main() {
logger := NewLogger("request.log")
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello, World!"))
})
wrappedMux := LoggingMiddleware(logger, mux)
log.Println("Starting server on :8080")
err := http.ListenAndServe(":8080", wrappedMux)
if err != nil {
log.Fatalf("error starting server: %v", err)
}
}
现在,每当有请求到达我们的HTTP服务器时,都会记录请求的详细信息,包括客户端IP地址、请求方法、URL路径、状态码和响应时间。这些信息将被写入名为request.log
的日志文件中。