diff --git a/middleware/ginlog.go b/middleware/ginlog.go index 65b868d..b849097 100644 --- a/middleware/ginlog.go +++ b/middleware/ginlog.go @@ -1,8 +1,10 @@ package middleware import ( + "bytes" "fmt" "math" + "strings" "net/http" "net/url" @@ -12,6 +14,23 @@ import ( "github.com/sirupsen/logrus" ) +// 需要记录响应内容的 API 路径前缀 +var logResponsePaths = []string{ + "/api/v1/message/send", + "/api/v2/message/send", +} + +// responseBodyWriter 用于捕获响应内容 +type responseBodyWriter struct { + gin.ResponseWriter + body *bytes.Buffer +} + +func (w responseBodyWriter) Write(b []byte) (int, error) { + w.body.Write(b) + return w.ResponseWriter.Write(b) +} + // LogMiddleware Logger is the logrus logger handler func LogMiddleware(notLogged ...string) gin.HandlerFunc { //hostname, err := os.Hostname() @@ -33,6 +52,24 @@ func LogMiddleware(notLogged ...string) gin.HandlerFunc { raw := c.Request.URL.RawQuery start := time.Now() + // 判断是否需要捕获响应内容 + needCaptureResponse := false + for _, logPath := range logResponsePaths { + if strings.HasPrefix(path, logPath) { + needCaptureResponse = true + break + } + } + + var bodyWriter *responseBodyWriter + if needCaptureResponse { + bodyWriter = &responseBodyWriter{ + ResponseWriter: c.Writer, + body: bytes.NewBufferString(""), + } + c.Writer = bodyWriter + } + c.Next() stop := time.Since(start) @@ -70,6 +107,13 @@ func LogMiddleware(notLogged ...string) gin.HandlerFunc { entry.Error(c.Errors.ByType(gin.ErrorTypePrivate).String()) } else { msg := fmt.Sprintf("%s [%s] %s %d %d (%dms)", clientIP, c.Request.Method, path, statusCode, dataLength, latency) + + // 如果是发送消息的 API,打印返回内容 + if needCaptureResponse && bodyWriter != nil { + responseBody := bodyWriter.body.String() + msg = fmt.Sprintf("%s | Response: %s", msg, responseBody) + } + if statusCode >= http.StatusInternalServerError { entry.Error(msg) } else if statusCode >= http.StatusBadRequest { diff --git a/models/cron_messages.go b/models/cron_messages.go index e12ada8..6d727b2 100644 --- a/models/cron_messages.go +++ b/models/cron_messages.go @@ -22,7 +22,7 @@ type CronMessages struct { func GenerateMsgUniqueID() string { newUUID := util.GenerateUniqueID() - return fmt.Sprintf("C-%s", newUUID) + return fmt.Sprintf("CM%s", newUUID) } func AddSendCronMsg( diff --git a/models/send_tasks.go b/models/send_tasks.go index 458eabd..ee58c86 100644 --- a/models/send_tasks.go +++ b/models/send_tasks.go @@ -15,7 +15,7 @@ type SendTasks struct { func GenerateTaskUniqueID() string { newUUID := util.GenerateUniqueID() - return fmt.Sprintf("T-%s", newUUID) + return fmt.Sprintf("TK%s", newUUID) } // AddSendTaskWithID 添加实例的时候添加任务 diff --git a/models/send_ways.go b/models/send_ways.go index 1041e4d..aeb64ff 100644 --- a/models/send_ways.go +++ b/models/send_ways.go @@ -17,7 +17,7 @@ type SendWays struct { func GenerateWayUniqueID() string { newUUID := util.GenerateUniqueID() - return fmt.Sprintf("W-%s", newUUID) + return fmt.Sprintf("WY%s", newUUID) } func AddSendWay(name string, auth string, wayType string, createdBy string, modifiedBy string) error { diff --git a/web/src/components/pages/cronMessages/AddCronMessages.vue b/web/src/components/pages/cronMessages/AddCronMessages.vue index c89a3cf..55210a7 100644 --- a/web/src/components/pages/cronMessages/AddCronMessages.vue +++ b/web/src/components/pages/cronMessages/AddCronMessages.vue @@ -42,7 +42,7 @@ const handleSubmit = async () => { try { let postData = { "name": formData.name, - "id": generateBizUniqueID("C"), + "id": generateBizUniqueID("CM"), "title": formData.title, "content": formData.content, "cron": formData.cron_expression, diff --git a/web/src/components/pages/messageTemplate/TemplateApiViewer.vue b/web/src/components/pages/messageTemplate/TemplateApiViewer.vue index 07668fd..664e230 100644 --- a/web/src/components/pages/messageTemplate/TemplateApiViewer.vue +++ b/web/src/components/pages/messageTemplate/TemplateApiViewer.vue @@ -153,7 +153,7 @@ export default defineComponent({ -
+

💡 使用说明