From 5e8d8d070a6fc83e933985406d50a77be0285416 Mon Sep 17 00:00:00 2001 From: Kuingsmile <96409857+Kuingsmile@users.noreply.github.com> Date: Wed, 18 Jun 2025 20:37:16 +0800 Subject: [PATCH] feat(log): add error logging middleware for improved error handling (#182) --- cmd/server.go | 2 ++ server/middlewares/error_log.go | 56 +++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 server/middlewares/error_log.go diff --git a/cmd/server.go b/cmd/server.go index 15fd37a9..ea5138fe 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -19,6 +19,7 @@ import ( "github.com/OpenListTeam/OpenList/internal/fs" "github.com/OpenListTeam/OpenList/pkg/utils" "github.com/OpenListTeam/OpenList/server" + "github.com/OpenListTeam/OpenList/server/middlewares" "github.com/OpenListTeam/sftpd-openlist" ftpserver "github.com/fclairamb/ftpserverlib" "github.com/gin-gonic/gin" @@ -47,6 +48,7 @@ the address is defined in config file`, gin.SetMode(gin.ReleaseMode) } r := gin.New() + r.Use(middlewares.ErrorLogging()) r.Use(gin.LoggerWithWriter(log.StandardLogger().Out), gin.RecoveryWithWriter(log.StandardLogger().Out)) server.Init(r) var httpHandler http.Handler = r diff --git a/server/middlewares/error_log.go b/server/middlewares/error_log.go new file mode 100644 index 00000000..f696e326 --- /dev/null +++ b/server/middlewares/error_log.go @@ -0,0 +1,56 @@ +package middlewares + +import ( + "bytes" + "encoding/json" + "fmt" + + "github.com/gin-gonic/gin" + log "github.com/sirupsen/logrus" +) + +func ErrorLogging() gin.HandlerFunc { + return func(c *gin.Context) { + w := &responseBodyWriter{body: &bytes.Buffer{}, ResponseWriter: c.Writer} + c.Writer = w + c.Next() + var errorMsg string + if w.body.Len() > 0 { + var jsonBody struct { + Code int `json:"code"` + Message string `json:"message"` + } + if err := json.Unmarshal(w.body.Bytes(), &jsonBody); err == nil { + if jsonBody.Code != 200 { + errorMsg = fmt.Sprintf(" error: code=%d, message=%s", jsonBody.Code, jsonBody.Message) + } + } + } + if c.Writer.Status() >= 400 { + if len(c.Errors) > 0 { + errorMsg = c.Errors.String() + } else if errorMsg == "" && w.body.Len() > 0 { + body := w.body.String() + if len(body) > 500 { + errorMsg = body[:500] + "..." + } else { + errorMsg = body + } + } + } + + if errorMsg != "" { + log.Error(errorMsg) + } + } +} + +type responseBodyWriter struct { + gin.ResponseWriter + body *bytes.Buffer +} + +func (r *responseBodyWriter) Write(b []byte) (int, error) { + r.body.Write(b) + return r.ResponseWriter.Write(b) +}