在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的日志文件中。