From c5365e4b4306e0084c1cb9f2020c7f7a5d7bcae8 Mon Sep 17 00:00:00 2001 From: CaIon Date: Wed, 25 Feb 2026 00:11:24 +0800 Subject: [PATCH] feat(middleware): add RouteTag middleware for enhanced logging and routing - Introduced RouteTag middleware to set route tags for different API endpoints. - Updated logger to include route tags in log output. - Applied RouteTag middleware across various routers including API, dashboard, relay, video, and web routers for consistent logging. --- middleware/logger.go | 18 ++++++++++++++++-- router/api-router.go | 1 + router/dashboard.go | 1 + router/main.go | 2 ++ router/relay-router.go | 9 +++++++++ router/video-router.go | 4 ++++ router/web-router.go | 1 + 7 files changed, 34 insertions(+), 2 deletions(-) diff --git a/middleware/logger.go b/middleware/logger.go index b4ed8c89d..151008d9f 100644 --- a/middleware/logger.go +++ b/middleware/logger.go @@ -7,14 +7,28 @@ import ( "github.com/gin-gonic/gin" ) +const RouteTagKey = "route_tag" + +func RouteTag(tag string) gin.HandlerFunc { + return func(c *gin.Context) { + c.Set(RouteTagKey, tag) + c.Next() + } +} + func SetUpLogger(server *gin.Engine) { server.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string { var requestID string if param.Keys != nil { - requestID = param.Keys[common.RequestIdKey].(string) + requestID, _ = param.Keys[common.RequestIdKey].(string) } - return fmt.Sprintf("[GIN] %s | %s | %3d | %13v | %15s | %7s %s\n", + tag, _ := param.Keys[RouteTagKey].(string) + if tag == "" { + tag = "web" + } + return fmt.Sprintf("[GIN] %s | %s | %s | %3d | %13v | %15s | %7s %s\n", param.TimeStamp.Format("2006/01/02 - 15:04:05"), + tag, requestID, param.StatusCode, param.Latency, diff --git a/router/api-router.go b/router/api-router.go index b6e418c6e..d48934000 100644 --- a/router/api-router.go +++ b/router/api-router.go @@ -13,6 +13,7 @@ import ( func SetApiRouter(router *gin.Engine) { apiRouter := router.Group("/api") + apiRouter.Use(middleware.RouteTag("api")) apiRouter.Use(gzip.Gzip(gzip.DefaultCompression)) apiRouter.Use(middleware.BodyStorageCleanup()) // 清理请求体存储 apiRouter.Use(middleware.GlobalAPIRateLimit()) diff --git a/router/dashboard.go b/router/dashboard.go index 17132dfb2..2e486156d 100644 --- a/router/dashboard.go +++ b/router/dashboard.go @@ -9,6 +9,7 @@ import ( func SetDashboardRouter(router *gin.Engine) { apiRouter := router.Group("/") + apiRouter.Use(middleware.RouteTag("old_api")) apiRouter.Use(gzip.Gzip(gzip.DefaultCompression)) apiRouter.Use(middleware.GlobalAPIRateLimit()) apiRouter.Use(middleware.CORS()) diff --git a/router/main.go b/router/main.go index 45b3080f2..ac9506fe4 100644 --- a/router/main.go +++ b/router/main.go @@ -8,6 +8,7 @@ import ( "strings" "github.com/QuantumNous/new-api/common" + "github.com/QuantumNous/new-api/middleware" "github.com/gin-gonic/gin" ) @@ -27,6 +28,7 @@ func SetRouter(router *gin.Engine, buildFS embed.FS, indexPage []byte) { } else { frontendBaseUrl = strings.TrimSuffix(frontendBaseUrl, "/") router.NoRoute(func(c *gin.Context) { + c.Set(middleware.RouteTagKey, "web") c.Redirect(http.StatusMovedPermanently, fmt.Sprintf("%s%s", frontendBaseUrl, c.Request.RequestURI)) }) } diff --git a/router/relay-router.go b/router/relay-router.go index dcec439cb..3d38be5ee 100644 --- a/router/relay-router.go +++ b/router/relay-router.go @@ -17,6 +17,7 @@ func SetRelayRouter(router *gin.Engine) { router.Use(middleware.StatsMiddleware()) // https://platform.openai.com/docs/api-reference/introduction modelsRouter := router.Group("/v1/models") + modelsRouter.Use(middleware.RouteTag("relay")) modelsRouter.Use(middleware.TokenAuth()) { modelsRouter.GET("", func(c *gin.Context) { @@ -41,6 +42,7 @@ func SetRelayRouter(router *gin.Engine) { } geminiRouter := router.Group("/v1beta/models") + geminiRouter.Use(middleware.RouteTag("relay")) geminiRouter.Use(middleware.TokenAuth()) { geminiRouter.GET("", func(c *gin.Context) { @@ -49,6 +51,7 @@ func SetRelayRouter(router *gin.Engine) { } geminiCompatibleRouter := router.Group("/v1beta/openai/models") + geminiCompatibleRouter.Use(middleware.RouteTag("relay")) geminiCompatibleRouter.Use(middleware.TokenAuth()) { geminiCompatibleRouter.GET("", func(c *gin.Context) { @@ -57,12 +60,14 @@ func SetRelayRouter(router *gin.Engine) { } playgroundRouter := router.Group("/pg") + playgroundRouter.Use(middleware.RouteTag("relay")) playgroundRouter.Use(middleware.SystemPerformanceCheck()) playgroundRouter.Use(middleware.UserAuth(), middleware.Distribute()) { playgroundRouter.POST("/chat/completions", controller.Playground) } relayV1Router := router.Group("/v1") + relayV1Router.Use(middleware.RouteTag("relay")) relayV1Router.Use(middleware.SystemPerformanceCheck()) relayV1Router.Use(middleware.TokenAuth()) relayV1Router.Use(middleware.ModelRequestRateLimit()) @@ -161,15 +166,18 @@ func SetRelayRouter(router *gin.Engine) { } relayMjRouter := router.Group("/mj") + relayMjRouter.Use(middleware.RouteTag("relay")) relayMjRouter.Use(middleware.SystemPerformanceCheck()) registerMjRouterGroup(relayMjRouter) relayMjModeRouter := router.Group("/:mode/mj") + relayMjModeRouter.Use(middleware.RouteTag("relay")) relayMjModeRouter.Use(middleware.SystemPerformanceCheck()) registerMjRouterGroup(relayMjModeRouter) //relayMjRouter.Use() relaySunoRouter := router.Group("/suno") + relaySunoRouter.Use(middleware.RouteTag("relay")) relaySunoRouter.Use(middleware.SystemPerformanceCheck()) relaySunoRouter.Use(middleware.TokenAuth(), middleware.Distribute()) { @@ -179,6 +187,7 @@ func SetRelayRouter(router *gin.Engine) { } relayGeminiRouter := router.Group("/v1beta") + relayGeminiRouter.Use(middleware.RouteTag("relay")) relayGeminiRouter.Use(middleware.SystemPerformanceCheck()) relayGeminiRouter.Use(middleware.TokenAuth()) relayGeminiRouter.Use(middleware.ModelRequestRateLimit()) diff --git a/router/video-router.go b/router/video-router.go index 875b0af86..461451104 100644 --- a/router/video-router.go +++ b/router/video-router.go @@ -10,12 +10,14 @@ import ( func SetVideoRouter(router *gin.Engine) { // Video proxy: accepts either session auth (dashboard) or token auth (API clients) videoProxyRouter := router.Group("/v1") + videoProxyRouter.Use(middleware.RouteTag("relay")) videoProxyRouter.Use(middleware.TokenOrUserAuth()) { videoProxyRouter.GET("/videos/:task_id/content", controller.VideoProxy) } videoV1Router := router.Group("/v1") + videoV1Router.Use(middleware.RouteTag("relay")) videoV1Router.Use(middleware.TokenAuth(), middleware.Distribute()) { videoV1Router.POST("/video/generations", controller.RelayTask) @@ -30,6 +32,7 @@ func SetVideoRouter(router *gin.Engine) { } klingV1Router := router.Group("/kling/v1") + klingV1Router.Use(middleware.RouteTag("relay")) klingV1Router.Use(middleware.KlingRequestConvert(), middleware.TokenAuth(), middleware.Distribute()) { klingV1Router.POST("/videos/text2video", controller.RelayTask) @@ -40,6 +43,7 @@ func SetVideoRouter(router *gin.Engine) { // Jimeng official API routes - direct mapping to official API format jimengOfficialGroup := router.Group("jimeng") + jimengOfficialGroup.Use(middleware.RouteTag("relay")) jimengOfficialGroup.Use(middleware.JimengRequestConvert(), middleware.TokenAuth(), middleware.Distribute()) { // Maps to: /?Action=CVSync2AsyncSubmitTask&Version=2022-08-31 and /?Action=CVSync2AsyncGetResult&Version=2022-08-31 diff --git a/router/web-router.go b/router/web-router.go index b053a3e63..17a8378dd 100644 --- a/router/web-router.go +++ b/router/web-router.go @@ -19,6 +19,7 @@ func SetWebRouter(router *gin.Engine, buildFS embed.FS, indexPage []byte) { router.Use(middleware.Cache()) router.Use(static.Serve("/", common.EmbedFolder(buildFS, "web/dist"))) router.NoRoute(func(c *gin.Context) { + c.Set(middleware.RouteTagKey, "web") if strings.HasPrefix(c.Request.RequestURI, "/v1") || strings.HasPrefix(c.Request.RequestURI, "/api") || strings.HasPrefix(c.Request.RequestURI, "/assets") { controller.RelayNotFound(c) return