linux

如何用Golang记录请求日志

小樊
45
2025-06-16 02:28:24
栏目: 编程语言

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

0
看了该问题的人还看了