package main import ( "github.com/gin-gonic/gin" "log" "time" ) // RequestAuditLogger 请求审计中间件。 // 作用:为每个进入的请求记录方法、原始URI、匹配路由(endpoint)、状态码、客户端IP、UA、耗时等关键信息,便于线上定位问题。 // 使用:在创建路由后通过 r.Use(RequestAuditLogger()) 注册。 func RequestAuditLogger() gin.HandlerFunc { return func(c *gin.Context) { start := time.Now() c.Next() endpoint := c.FullPath() // Gin 匹配到的路由模板;未匹配则为空字符串 if endpoint == "" { endpoint = "" } log.Printf( "RequestAudit | %s %s | endpoint=%s | status=%d | ip=%s | ua=%s | cost=%v", c.Request.Method, c.Request.RequestURI, endpoint, c.Writer.Status(), c.ClientIP(), c.GetHeader("User-Agent"), time.Since(start), ) } } // NotFoundHandler 处理未匹配的路由。 // 作用:对 404 的请求进行详细记录,并返回结构化的提示信息,方便快速定位来源与路径。 // 使用:在路由注册完成后通过 r.NoRoute(NotFoundHandler) 注册。 func NotFoundHandler(c *gin.Context) { log.Printf( "NoRoute 404 | %s %s | ip=%s | ua=%s | referer=%s", c.Request.Method, c.Request.RequestURI, c.ClientIP(), c.GetHeader("User-Agent"), c.GetHeader("Referer"), ) c.JSON(404, gin.H{ "code": 404, "msg": "接口不存在", "method": c.Request.Method, "path": c.Request.RequestURI, "client_ip": c.ClientIP(), }) }